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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 L2 g+ ~/ c, @3 p. W

/ z, z# h$ a" WOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 M1 z$ ^7 o' N  Z0 @: j#include <unistd.h>
  U; ?7 p, u5 S3 o: h#include <sys/mman.h>
& C. N  I. c# \* d% f#include <sys/types.h>
; h5 G, y5 q7 r7 b0 C#include <fcntl.h>- j% `" H0 P4 Y) g3 a$ n
) g) ^% G5 \% F
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
' ]5 d5 G0 C/ i4 Y' j3 L" C2 j" i  W0 ^* f
typedef struct6 ^' f: g! k7 ]# w2 I! Z
{) W; X$ q* e6 f, J& m, F: g0 o. n
        unsigned int a;1 {; ?. O9 l! _1 `
        unsigned int b;/ Q6 G) \% s) v2 X) _! _
        unsigned int packet_cout;
6 e, R1 n5 ^% s  a+ I/ I! D1 i8 M}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ w- f( v5 B; }4 L$ P5 [4 F
6 R; w: f- X* I& `* f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 J; d( ?1 ~) u" G8 Eunsigned int count_copy = 0;
/ q/ l2 j  ~# f7 y3 K: k0 t( b1 g9 p; J

6 v% q! _0 Z, M% i" y+ C8 Qint main()
. X3 A* E! y& r! c6 p! Z{& s" ]' Z1 @2 Q- S& q
        pRX_MSG_PROTOCOL pshreRAM = NULL;" t( N+ M4 E) v2 R) J  U
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# K+ \6 I& ]" B2 \/ Z, U( N( w% n

( t' O5 `# D0 j. Q1 W# G        while(1)1 \1 a# H) E7 ?" g
        {1 q" Q- d6 S6 n2 Q: O
                read_MSG_buffer(pshreRAM);! K. v5 H+ b9 i3 q" P0 V/ |% Z
        }                8 O0 f& S6 b2 R, A3 i
}9 f& l9 m! \* u$ o& s% X0 T* z% n7 E

  \% q# o/ B  n, N  Pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# L3 p$ m& D. o/ E1 `
{
' H( j, q4 x; b1 v        RX_MSG_PROTOCOL buf;
6 I/ t% r. n1 _0 c! S' L1 N        
5 ?' S! ?5 Y2 `; n7 R0 w) ], p  u7 q. D        buf.a = pshreRAM->a;, @% a: y6 d2 |% {" `$ c
        buf.b = pshreRAM->b;$ L$ Y; E0 x# Q! G+ n2 w
        buf.packet_cout = pshreRAM->packet_cout;$ s: U% Q' z$ r# I9 m  n- O% o# O* K
        
) }/ `! z3 J) g7 Z* K+ R* `/ u        if(buf.packet_cout != count_copy)
; t- B! D" ]' T2 p! N        {
2 B# B: s1 Q' r# ?4 |# w                printf("a is %d\n", buf.a);
9 j+ u9 z& q$ @. X                printf("b is %d\n", buf.b);, z+ u; u9 N/ Q9 q0 f, J
                printf("count is %d\n", buf.packet_cout);
0 H, L- n1 L- i9 `, C: o7 A                count_copy = buf.packet_cout;) C$ l' Y, n: f; i; ^# Z. [
        }% ~8 Y- c+ b; s( z0 p
        else
8 j6 f  B# X8 i7 P- n+ n1 p        {
0 _3 e2 Y2 I& G3 B4 u                printf("No effective message!");
1 r8 w' j: O5 L1 q        }
  ]4 N" s) w7 P6 N2 M8 W}* w% x& `* u, H/ O- k
. z% |, j5 Z+ G
2 g4 ]7 B6 D( A2 J% ^4 ?
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* u, ?( |3 |' s6 I. V+ y使用下面代码,对内存使用了mmap函数后:
- v* E7 [6 {3 u; s#include <stdio.h>
$ T7 i" |' u4 B, V#include <unistd.h>1 K0 `6 [! f& Q7 c! b3 q! _
#include <sys/mman.h>% n! s* b+ N1 I) d  V5 Y
#include <sys/types.h>! U' t8 {  Y0 T! I: Z1 N
#include <fcntl.h>: S! c8 Z7 R6 l  N8 n
" x( }% j3 |/ |+ ~+ W
#define SHAER_RAM_BASE_ADDR    (0x80000000)
- V+ o+ h7 F+ `7 I( f#define SHAER_RAM_SIZE         (0x20000)   
; ]' z/ o" W  ]: w" z+ i; ^! V0 E8 z$ K3 {
typedef struct
8 q3 K5 q+ S- J* _+ C{
! y8 O4 w# K  G) G        unsigned int a;4 [3 _; b1 ~2 V
        unsigned int b;: O- b, \5 o0 w+ ?5 Q
        unsigned int packet_cout;
& a# Y" ]7 H& [& V' K9 S5 L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* t/ r& r  @  J) T0 V* b/ \) P& I8 ^: J/ F9 |% u0 C
void read_MSG_buffer(int *baseaddr);
' K  V! O2 z" w$ q' h/ Lunsigned int count_copy = 0;0 G+ B. }( i  c9 t& K3 w7 n

' m/ l- Y8 L0 r8 J& `9 S8 Qint main()4 U3 B, b* p% p! N+ N
{: s; ?  w, \! h0 p5 d( j1 _
        int fd;0 }1 R+ I" Q  e. b, `, X
        int *mem = NULL;
1 O4 _2 r* f5 r/ C* K' B% o
( r( }3 @! S( L" q- n" K; X        if((fd = open("/dev/mem", O_RDWR)) <0)
# k' V& \4 J  J3 ^: F        {% N! T7 `9 [; h6 n, V
                perror("open error");
- I1 ?- c$ N  w) i                return -1;/ l7 R( A) L1 Y8 a' V( H
        }
" F( E* e3 s& U7 `6 N# q5 P" D        5 k' P: f+ _% f& P. T
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 g# j+ L3 l' t! K9 G
8 |1 Z+ c& ^% v0 v. z7 ]3 Y        while(1)
) Z1 W: J* e! Z8 v4 D( Z        {
4 m4 T; k  `1 ]                read_MSG_buffer(mem);2 Y6 v9 n6 v( t/ a. G# G. V
        }                0 K( U1 ?# E( n# |" ]
}' Z# j4 L. F$ V6 b! U$ e* r
2 d+ z7 y; T  d- j, n) Q7 H4 ?* o2 m  t
void read_MSG_buffer(int *baseaddr)9 h1 W% C& B% v
{
/ T) D9 _; ?5 ~: o  [+ S        pRX_MSG_PROTOCOL pshreRAM = NULL;9 ^2 k3 C" u# F; r9 K

4 s& ?0 m- n8 U        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
) \9 F, w7 e" @0 a3 J" w# Z  _$ `% h2 H# {) d" }' x$ C  [
        if(pshreRAM->packet_cout != count_copy)
$ v: S2 ?7 `1 o- Y: {/ @4 U        {( n2 e$ n! E- y/ h
                printf("a is %d\n", pshreRAM->a);
- p6 k$ @2 H; t                printf("b is %d\n", pshreRAM->b);9 e) o: h3 t5 ]2 X# e
                printf("count is %d\n", pshreRAM->packet_cout);
3 p3 l& D+ G4 s1 C9 P) d                count_copy = pshreRAM->packet_cout;# M- G' k' r5 o- C
        }8 K+ |8 ^6 }6 W9 p% Q. ]* A
        else2 h7 D, g5 D+ l8 f  I
        {+ T" T7 Z3 g" }0 P
                printf("No effective message!\n");
5 Z7 r  g! R* v3 p        }& U7 k8 z  ?6 j2 k  i" l  }/ q
}
) @3 {% x. j( I
, u4 T, L$ ?7 _没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; i+ p) s; {; |& p+ {  X6 K# y9 j  Q4 @4 S% E9 C0 w
  U9 n0 g& h1 z4 H
$ [& A9 R. W3 i( r% f

2 W6 U( }9 G) h% q$ O9 m% C* W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-17 01:17 , Processed in 0.041175 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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