OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- d7 x. Q! T$ B7 C" ^, Y; c* N
% t( n$ G9 ]6 r. E" pOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>  R# y* r. u* c
#include <unistd.h>% h: a. o( E( Q9 B1 k6 W! w  ]
#include <sys/mman.h>$ _3 E0 Q4 t, [6 t  Z
#include <sys/types.h>1 ?2 n0 P  A) K! |1 I* {+ j% `/ q
#include <fcntl.h>
) o+ \( U4 F/ Q' R) S$ {1 u
7 g% X( P& B/ U#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! \1 ~9 P' u6 s# S- A
2 c# |$ W* `" |. N
typedef struct
. R* K, Q% i% n{0 J9 H) C# B3 j- ~
        unsigned int a;3 J; B$ \" ^1 z/ ?
        unsigned int b;4 h5 p* }7 A$ b
        unsigned int packet_cout;+ U) k' C& B3 l8 q; i( h) u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: L1 `) U5 I, ?4 @/ h5 D  b

/ m7 }) f" h. `/ {void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 M" D4 d4 c$ {unsigned int count_copy = 0;
, K8 {' L  G1 c) L2 w- X7 a: z0 g. Z0 ^' G( M

! {$ }( j. E( I' c2 X, zint main()3 g( }4 ~$ U! t. |. k
{
7 s! y& E7 ^" g; A4 J. f6 s        pRX_MSG_PROTOCOL pshreRAM = NULL;
& x! v9 g, j6 H- f" ^$ Z7 {* U        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 V/ Y% O+ i. p6 {8 W, Q
+ N- k" n5 z- b( n% B$ K6 @
        while(1)" m# C% S9 @* G, t7 t
        {2 K$ [$ ]9 m& ?: |
                read_MSG_buffer(pshreRAM);
* J. ], s2 V; `! B        }                ; @$ w5 B; j/ [  o5 E- {, \. I
}
0 p# W- m& W1 c& t+ {; n
3 \" T. D% [4 |" w. L& Y5 i: Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( P# l8 L# c* I# c) [( x+ V{
8 l8 [5 w$ u$ g8 h        RX_MSG_PROTOCOL buf;
, \4 ^$ y5 `$ u' o( G: r" c/ L        9 s- Q! Z; z3 H4 Z5 n) d
        buf.a = pshreRAM->a;
, U6 e! h; j$ S  g- y        buf.b = pshreRAM->b;1 m# D: s; h: y# d* j* N
        buf.packet_cout = pshreRAM->packet_cout;% x; G9 V. X: T; [/ l
        
1 H  Q' j7 d/ p7 \  G! p5 n        if(buf.packet_cout != count_copy)
. P0 W7 A$ t/ G. t) H) L3 N3 }+ p        {. W: k  k1 m+ [8 h
                printf("a is %d\n", buf.a);5 f. n/ V4 x6 a$ ~& O0 \; E$ P' O
                printf("b is %d\n", buf.b);3 r$ g6 {& _! _% j$ t
                printf("count is %d\n", buf.packet_cout);
  L: Q+ O) p% P5 S; Q                count_copy = buf.packet_cout;( J( l$ \1 u' z* h5 L# O% L
        }
& N9 R4 t3 B: Q8 G, \/ v        else
6 V! U$ K. A% \* L$ Y3 c        {" D6 y& u0 \" n! l
                printf("No effective message!");
4 U; o/ @' B% D) N9 S        }( v$ S; f6 h, r' P
}! \0 j1 U% s% X, @5 [" X

& X: @8 x# C  r0 U8 Q8 L6 A/ g/ z9 ]; E! p" {" L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- o; ?* t% X: H; j" Z# _& g
使用下面代码,对内存使用了mmap函数后:
1 ~- g, Y0 o2 O0 o#include <stdio.h>) r' Y4 o9 T: ?2 U+ `5 [$ {
#include <unistd.h># w$ y% K; @# |8 S9 t8 v
#include <sys/mman.h>% e$ m! t7 q4 G
#include <sys/types.h>
) }1 u' O  l  A: v0 z#include <fcntl.h>+ {: B0 R  a- m1 v& h' H

, ]9 E# [  m7 l2 ^: n# @#define SHAER_RAM_BASE_ADDR    (0x80000000). t* {8 W3 R' ~- E6 g6 d7 F6 V4 u2 A2 Z
#define SHAER_RAM_SIZE         (0x20000)   . K* v6 Q1 v2 a$ _* T& K; T! F1 X
* b/ O) h5 x& t$ ^. E: a0 B
typedef struct* W7 t2 C) @+ N2 w, a
{
% L) I2 f" u* z6 |        unsigned int a;5 J& E, C( R# p0 ]3 ]
        unsigned int b;! F4 B3 \- W" R" \. Q6 k
        unsigned int packet_cout;1 X0 W6 m+ F4 o* z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 g  W8 [! N# g6 A5 {0 w' r/ m+ {/ l
void read_MSG_buffer(int *baseaddr);
" Q# m1 X. B1 `" t# F; V2 v; Funsigned int count_copy = 0;
- c: {% R6 h8 W' {$ q# m% x: y
+ \+ O3 p9 ?" |9 _) v; A4 Qint main(), N& q  K7 G1 _8 d4 Z+ q0 Y7 c
{
$ g7 a& p* L. z% e: M        int fd;
5 \* K) N6 d# s* F/ i        int *mem = NULL;
) X( T8 m2 _3 Q: u) `) H6 c% ~) \1 S. @$ R6 H# y) p
        if((fd = open("/dev/mem", O_RDWR)) <0)
3 _( H" u1 u3 O0 b. b+ B* \        {, z/ x6 _3 c$ s$ g- F
                perror("open error");
2 r; e% |& |$ p                return -1;
. U3 }+ z! U' m% \2 O7 o        }* T3 w: w0 H+ }- K# C
        
" B! p$ {8 M9 G% M        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: [! G# Z9 a% k
2 s1 \3 J1 e% }  E        while(1): A, J6 x3 X& O6 e7 V5 U
        {
/ a3 U+ f  b2 ^$ \                read_MSG_buffer(mem);
- u2 Q. B: n1 U! t) U* Z8 o: V        }                ! T/ a* q8 c9 ?7 M; Q# m4 R, H
}
( H& s6 y; B+ @: c* V) [7 `/ p9 z" ?9 {: k
void read_MSG_buffer(int *baseaddr)" y( g& q" y8 p; ~0 }7 k& z2 X, x$ ^
{
" x* [1 |0 M0 G' Q( a! B) U        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 w  {' v( y' [% h( V; b% c' p+ j9 z8 N" Z2 O2 k5 J. t
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* ^! |1 B+ G7 m7 V! L7 U5 I; Q% P7 r: ?
        if(pshreRAM->packet_cout != count_copy)$ h3 Y- S2 G( k, s; }; [; \
        {
" ]7 U9 R, }/ g                printf("a is %d\n", pshreRAM->a);
5 C6 x4 x  V& Q! G0 {$ o( {                printf("b is %d\n", pshreRAM->b);
. ^2 n0 Q' N1 R/ w# M                printf("count is %d\n", pshreRAM->packet_cout);- L0 O) j4 `' B; ~% o
                count_copy = pshreRAM->packet_cout;
5 L& ^1 S3 _9 s  n' N; x, T/ Z2 K        }2 o7 m2 d& x' }) S
        else8 ~5 q; o& D) n
        {! A% i9 j- U* Z; L4 G2 J
                printf("No effective message!\n");  W, e7 B+ [" Y
        }5 W7 `. `: N9 K) D5 M2 r; P
}
& e4 j6 w4 Q/ A' l# C' v3 B# b5 E8 X% K5 P  p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% r; v2 q; C+ \$ w
5 T  D0 U2 L1 z2 C- o, ~
5 V6 p$ ^# q: |0 g( o
6 \: i! ?! |' {3 F8 Z. X) m% ^9 m8 k/ x: O1 n9 w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-2-20 19:32 , Processed in 0.038871 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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