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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * ]" e& D3 \2 c

  |" H7 X* L# A; z- Q& POMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! y& l" z* C6 {0 M4 p+ |; `#include <unistd.h>; |0 |0 }+ |5 C- ^1 r
#include <sys/mman.h>( T! b' u* V+ X! }* Y8 B% J
#include <sys/types.h>
$ J6 m' D; ^- s  u+ v#include <fcntl.h>
1 X( J7 k: ?" N4 V5 W6 W+ d
4 l% E+ Q8 }2 Y- s7 V  G#define SHAER_RAM_BASE_ADDR    (0x80000000)   # I% h  Y: i) M( k; J

* Y$ k' [) L( r! gtypedef struct8 K! \( Q1 E0 W: Z
{
. b7 Y* G3 t: ]3 ^& R        unsigned int a;
' R. ]4 W  V) c1 Y) t0 @3 b        unsigned int b;+ |& T. ?" P% E/ g( A
        unsigned int packet_cout;9 Y+ `0 ~) R; u: m! r9 c3 z* w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 r3 q. h+ x4 t7 \% ]- \: X6 c6 Q

$ l5 ^5 u- L2 s1 Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. H' E9 R, o8 N" ~unsigned int count_copy = 0;9 I+ R/ m! Y, c

* ]& K) a% R8 t3 ?5 N, ~. s
1 h& y6 G+ w6 R; p4 m% {1 _int main()
3 Y& R# n$ N; E9 A  f0 B{6 P$ ]- Q2 l" Q" V
        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 n4 Q/ C" _" C+ n+ L        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 m; S, `9 X1 D3 c7 s7 }# |% N3 k; f; @( P( p" K8 G6 R
        while(1)
) c: N$ W! F- a8 l        {
0 J3 S7 ]) R/ K; a0 H. C( E/ |                read_MSG_buffer(pshreRAM);: v; T6 J1 M; b( S5 @
        }               
7 P" k  ^) x* k- x6 T}
: F0 B2 i$ h1 i4 r, j; t* V+ t8 }: P" g5 H* m- a) U7 e7 k' B- N0 Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 f# B) c7 h6 @
{
: F; |! B, S1 @% M# Z        RX_MSG_PROTOCOL buf;# r0 U( H) h. c' L; D% K
        
. }) g0 H) P2 z2 P        buf.a = pshreRAM->a;
1 B6 \  N9 k1 S( ~        buf.b = pshreRAM->b;$ z2 Y! p% _2 W
        buf.packet_cout = pshreRAM->packet_cout;5 y. R- K) C' t9 p
        
5 ]: e! ?5 i" \, l: t        if(buf.packet_cout != count_copy)1 U! c# q5 w! B+ u* G* H2 n
        {' t, Q+ {1 T- O/ G9 D  L2 l7 W0 B
                printf("a is %d\n", buf.a);  |+ \- G6 l9 k2 C) T
                printf("b is %d\n", buf.b);, p  n; g/ @  ?' v
                printf("count is %d\n", buf.packet_cout);
- O0 g" I9 A/ L  u7 C: ^: E                count_copy = buf.packet_cout;( t" h# O2 y% r
        }, u& Z: U- B- W/ ?  t( x- l
        else
! O, z. z, v% j; T        {" k5 L0 M6 r. r! u( x
                printf("No effective message!");
0 g% l7 L6 ~2 d  M4 e        }4 ^- Z3 ]- V+ s0 n5 T' H& c
}
% U+ N* w$ X3 n7 M9 y2 V' @
; R4 q9 S2 U& }2 o' t6 _2 ]* V4 Y$ h0 c, |8 p4 H1 [
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ c) D" c2 l: K- F
使用下面代码,对内存使用了mmap函数后:  j) G- u7 r9 D! y6 D7 Q
#include <stdio.h>
$ N* \4 ?1 s6 T. U$ K8 Y2 r# n! W#include <unistd.h>( w3 {) u' x, v1 I. T
#include <sys/mman.h>3 m/ a7 I' U$ W/ J
#include <sys/types.h>
6 o$ k% T# K5 d7 u/ e8 S+ `, x#include <fcntl.h>
* N% d8 Y, A9 u# Q; A
! {  x1 _8 r' o#define SHAER_RAM_BASE_ADDR    (0x80000000)! f* l0 E. m% ]1 d2 D. g
#define SHAER_RAM_SIZE         (0x20000)   & \8 t7 [- j3 O
& p$ I; V/ X( }3 o; P) Q6 Y
typedef struct
$ ~' I5 c: |% _3 ^' Z{1 P. U; {& F- H& d' d5 q1 f* N
        unsigned int a;1 V" e% g6 v( j0 @0 [7 |4 ^
        unsigned int b;
0 M. r/ O  T' |( G, R6 S        unsigned int packet_cout;) P# v" M+ g) ~. p1 a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; V1 ~& K; L: z" l" U5 l9 C) P3 S
8 i/ O6 [1 C, q" _7 wvoid read_MSG_buffer(int *baseaddr);
" N( e) G. n7 sunsigned int count_copy = 0;' g0 Y& G. O* x

( e8 H; z& o1 u& i4 u. pint main()
' G0 Q: N  _( B, T5 g$ [* T{
2 c1 i! X5 x/ w6 A2 y) X        int fd;. x2 s: [+ R' o! ^" `3 @- _
        int *mem = NULL;
# a. {! S! a$ s# r( _
: }$ m1 V3 [# Y! w8 ]        if((fd = open("/dev/mem", O_RDWR)) <0)5 E1 B" u  [+ W8 @, B5 s' ?2 J
        {1 T! |1 R# g. a9 f
                perror("open error");& k+ o, `- ]6 Q7 q/ ^' |
                return -1;7 [$ j$ [0 r$ h7 \1 M9 U( x
        }
4 \; n4 x* o; N) W        
) Z: `2 t( m" T: `$ B+ O        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);5 G1 a+ [* c0 r3 y- `0 U

3 l. \, F1 k4 Z        while(1)
5 p6 s( R, b2 W        {) b2 S  }& F) {5 q5 C8 f' f
                read_MSG_buffer(mem);
" I. f( W$ x3 V7 ~! p# |        }               
  I' [: U! N/ s/ \* v/ \% I}6 V! c. J+ e3 _  p
6 Z& N2 d; }1 D. V. T& e8 `
void read_MSG_buffer(int *baseaddr)% C3 R8 T( R  w  f
{
2 d" V; g5 ~8 J% p: l        pRX_MSG_PROTOCOL pshreRAM = NULL;0 I; P- B8 Q  N
+ Q  @2 A: |  u, ~2 j& ~! o
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, A. z" Z1 I- g

8 h3 ]0 P* _/ _; G. F        if(pshreRAM->packet_cout != count_copy)
8 Q+ Q+ K1 C8 B3 v4 [  C        {. f7 j2 E0 ?: ?# X4 S1 {2 M
                printf("a is %d\n", pshreRAM->a);
  W8 P% i3 p- g+ V                printf("b is %d\n", pshreRAM->b);
# U% I* A* |" X  {6 K& D                printf("count is %d\n", pshreRAM->packet_cout);
9 ^5 p$ `- K: Y3 w                count_copy = pshreRAM->packet_cout;
+ H% _3 z7 c, |$ \: v) T        }9 v2 R) P, N+ z$ o
        else
3 i3 n( M' {3 i! I4 \        {
: I" N# \2 }0 |! a                printf("No effective message!\n");  L. d$ W0 e8 X9 ^: M# N
        }
+ v0 V8 j  W" I9 g' L}8 B0 {% F1 D3 d7 F( S
4 e  x5 E# s( A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 X0 K6 g9 n% \
& e& m+ m- Y" G% n+ b! U( S% B0 Z0 K. \. A$ Q5 o1 R
9 _) t  e% o9 G+ b+ ~
6 y% T2 W- b) E3 @6 Y# D; j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-16 10:03 , Processed in 0.036642 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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