OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5372|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 l1 R. U5 e/ D: d* l
$ t8 E  o: ]& ^, Y+ U
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ v" F* [+ o. ?. U5 I#include <unistd.h>7 q* m! {6 e: j, V4 ~& I+ i# s
#include <sys/mman.h>
3 t7 ?3 ?& C- |  y5 g- d; f5 A#include <sys/types.h>
/ X/ N) B. v/ k) Q0 ^2 h8 [#include <fcntl.h>
0 A; _5 o( N4 f( P. I% \/ u. Z$ W; S. R: Q. s
#define SHAER_RAM_BASE_ADDR    (0x80000000)   3 `% Q+ K# s+ c! q

5 o' _9 a+ H$ B4 wtypedef struct. l7 ?+ ]) E( J$ o
{0 d$ a! G$ J: j4 U3 M1 }
        unsigned int a;
4 y( K; N/ X! @1 A" ^        unsigned int b;
: t' s; U9 B7 d6 N2 O. a        unsigned int packet_cout;
% \& a4 x. R2 X4 i# f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 V  X' L6 D  s% j1 I* u

1 A/ d9 T% ~7 |' k! a" m4 Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% P" a$ @$ M+ f. Yunsigned int count_copy = 0;: T, q9 q, y6 b7 H, N( e8 z

& H+ V+ C) w+ K7 {1 ?' c  X2 j
0 q9 |4 r: `6 t) \int main()! W1 K6 I5 g1 o$ d
{9 ^8 h& J" `1 E
        pRX_MSG_PROTOCOL pshreRAM = NULL;- g6 J- w  h% k+ p: v( D& T+ b
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# L% E$ n( q# [; N, D5 t" Y1 f
" C1 }4 Z& i0 w        while(1)
& B1 s1 ?% l( y% }, m. ~, X7 w+ M        {
3 h% z  }$ k# c  Q9 G                read_MSG_buffer(pshreRAM);' D# ^* h" o1 ?( H& Q2 b: `
        }                5 N7 |% }' U# c6 u, E
}3 E5 B  ~9 X, w& F
8 B2 V( g5 }( Y  O2 s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 t0 l* k/ {) t5 |9 z{, p9 j; o# ~% O2 h+ r. z- t
        RX_MSG_PROTOCOL buf;: v6 t7 @# Q; x! s* y
        
$ `6 N* X0 {) B3 q        buf.a = pshreRAM->a;
& v9 k7 R5 i  P  R  h        buf.b = pshreRAM->b;6 t3 n  s7 K+ Y) q
        buf.packet_cout = pshreRAM->packet_cout;' {& N2 l8 K( `2 j' G0 h; G+ e
        
8 z  L' U* N, @5 ]        if(buf.packet_cout != count_copy)
/ V: d7 e8 T7 W7 [0 I% A        {
7 D  ?, b0 i7 f1 C! y; z( c                printf("a is %d\n", buf.a);
) q$ l. y* m- p3 s9 U# u8 N+ _                printf("b is %d\n", buf.b);
# U4 Y7 a( B( B4 v! w                printf("count is %d\n", buf.packet_cout);% u  q2 ?( ]4 c# m
                count_copy = buf.packet_cout;
8 c) M& f. h6 e        }4 _6 Q9 j: Y. H
        else* y) Z; m# P  [: ^
        {
  r% _* E' g* i/ p. H4 `7 l! n; ^- ~                printf("No effective message!");
# U' t: p( g* Z/ a        }
0 H+ B" a# t5 L4 V( c6 ~8 f}. l8 `, r' E1 {. l7 e6 _$ e7 u' o

7 O7 k$ k9 a% \  ?6 \$ u
: _: ^0 K1 M- \  O但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) d% d' R9 K+ i( C* S0 U
使用下面代码,对内存使用了mmap函数后:* F) m6 s% h8 X- @  c
#include <stdio.h># G6 \! l; s# q& L
#include <unistd.h>/ H/ L4 o! w  c# c
#include <sys/mman.h>
! a  f. S1 ?; P3 U8 t1 l#include <sys/types.h>
: ]5 e% c5 z* j& O$ s/ U3 s7 `#include <fcntl.h>- M2 ~) I  [4 q" y
9 u3 s' L& L1 Q7 d
#define SHAER_RAM_BASE_ADDR    (0x80000000)
/ L9 o+ t. [4 l5 w# y5 J. w( C1 V2 l1 \#define SHAER_RAM_SIZE         (0x20000)   8 k- S, ?  M2 K1 K/ r# F* C- G

% m$ |4 L4 I8 Ytypedef struct
, S* C1 @  m( `7 Q! |  x{1 f5 }5 k& K. X% h0 k! A
        unsigned int a;( @9 j8 P8 p+ p% D
        unsigned int b;
% }8 A: S# M  s* X        unsigned int packet_cout;
5 u6 |% d  W4 y1 F' h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" V* d* r  u0 m+ x# V
+ O1 t: |1 e+ ~, d0 X
void read_MSG_buffer(int *baseaddr);
7 J5 a; l% A' x: V; q' `unsigned int count_copy = 0;
, [) z' O% l1 b% z7 m
0 X  q, U/ g& p, Hint main(), P& m; {" m1 d' a5 m3 M" I5 G
{
7 H7 U! U( [( c2 q: b  S        int fd;; _1 n; g, X+ B5 u
        int *mem = NULL;
; V' J" J( F! o
! u; m1 h2 y% C        if((fd = open("/dev/mem", O_RDWR)) <0)
" S( b) c% e% p" U  x( ]4 u; Y        {1 L' H. P: Z5 X. i: o3 d( {$ g( x( C
                perror("open error");
* R8 L: t& r, @2 l! q                return -1;
) _2 f5 r' ^! P0 i        }6 Y2 c% {7 c. j' j! ^* X
        5 ^# j3 H1 c9 z' E1 ?: S" ~' }
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 x, c! g( K) N  i
$ w) H, ?* d0 n, v( `5 o: Z        while(1)6 Z; h/ }$ W6 v7 h5 r
        {( h; ?6 Q8 D# v. e9 C. }) q; a
                read_MSG_buffer(mem);1 \( t' H7 U% j: v! z& h% Y
        }                " k! F& r& u8 A5 s0 i$ I9 K3 T$ z- @
}% ?' ^' a  ]7 S3 Z/ f8 S
$ L) o" M/ H. U0 \  N- e: `
void read_MSG_buffer(int *baseaddr)
4 f$ n0 E- K0 C# v( }{2 X2 p/ i! ~7 E, H
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' K& S" ~: q& w7 L2 i' c2 A- y
4 ~) A$ w3 q- _4 b( o        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 i0 H. u- X& ?7 D3 Q+ e
* M( e1 H( c. M8 s/ ?0 p        if(pshreRAM->packet_cout != count_copy)  g  B  i8 N$ w' j( b
        {
- o; _3 h( c$ t5 G! E/ |/ x                printf("a is %d\n", pshreRAM->a);5 g7 W$ x* C, [; _8 f7 v/ T! \
                printf("b is %d\n", pshreRAM->b);
6 s3 x3 y7 T  b0 m& F7 S  c                printf("count is %d\n", pshreRAM->packet_cout);
* d2 y& D! S. G                count_copy = pshreRAM->packet_cout;
0 b; ~, r) S, y/ K2 L2 n% q8 Y! J5 I        }; f: G- s% n0 t6 W4 l+ m7 w
        else: @6 r* b$ ?2 _' y8 U+ ^7 L; F, G
        {
& O# |" A+ k2 G; z                printf("No effective message!\n");  o6 M& O: Y# {0 B% M
        }
; p3 V$ O" L2 O}
( c  ^! T1 z7 I
+ V: A) k' B0 v没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 v! y; n* D2 D0 r4 d- Y+ L: n" B9 Z7 l; q3 o
# t% w7 Z, v2 L( ^

( a$ l1 a5 F( C7 n9 X$ o8 D( I7 H. ]0 c5 X# L4 h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-12-26 09:47 , Processed in 0.038324 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表