|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 Q2 }- J( ?; C2 Y/ c" U; L. {& M) L1 ^, [3 w5 F
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 }4 G* T- O3 W& Y
#include <unistd.h>1 y/ [% }6 w+ Z8 O3 T1 m
#include <sys/mman.h>
* O/ M: `0 { C R#include <sys/types.h>
5 L5 F5 b8 X. C% S#include <fcntl.h>4 `; h4 b) l4 G! b) R
7 e$ o" W5 L: m1 t
#define SHAER_RAM_BASE_ADDR (0x80000000)
. L0 ~" k6 `3 p. L1 N( k( f8 x' ?3 F
typedef struct+ i* B: |; f# Q' V
{
* u4 r3 K2 A) f: K unsigned int a;# G0 |/ w4 Q* s4 o& ~
unsigned int b;
2 j% J0 D" L7 l k* l6 a unsigned int packet_cout;
( C* _) O8 T( ?' `. _/ @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ H* n5 P+ k8 D! D" q* h; p* K- P9 q: T. z x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. X, n7 k/ K- v- @6 q# zunsigned int count_copy = 0;
' Q9 O* \+ f/ [ H9 j
4 r0 t9 R# r5 Z, B# S1 Y8 U
! D2 r& k2 _* o5 {! N# eint main()
8 w% ^* |: w" e: I{
, l, p+ I; j& [5 F pRX_MSG_PROTOCOL pshreRAM = NULL;; {8 a. E# C0 j0 q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- B2 ]8 Y" N1 H! k, M1 G! E" K; q! Z
while(1)2 ]/ Z# e Y6 }
{! H1 r* \. T) S1 F% b
read_MSG_buffer(pshreRAM);
+ ~6 i$ Q( q4 V$ g' D3 d }
0 X% @7 c5 d8 n( b}" ` X! A! q1 k
9 N+ y2 w5 P9 B* N M5 rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 a$ b7 A" r0 a. l* f L( G
{
) f3 h" Z3 ?4 ]9 }" K* k RX_MSG_PROTOCOL buf;+ e3 c; L r: {0 r. N
- Q2 r9 R3 s, g7 x buf.a = pshreRAM->a;$ I* P. l4 n8 ]) U
buf.b = pshreRAM->b;% o2 J5 P! ^+ }8 t2 F' \/ B# |
buf.packet_cout = pshreRAM->packet_cout;
/ \) ~+ B& o* f3 ?* p
' t- k, H& Q4 C0 F2 B; Z6 H& s0 v3 c if(buf.packet_cout != count_copy)
! q0 D' Y: C, V9 H4 d {; u% c" E" s2 d+ }, h6 d1 T
printf("a is %d\n", buf.a);; H6 C5 W6 m$ s, e1 I8 e0 E
printf("b is %d\n", buf.b);: i9 D. S$ D4 |/ i
printf("count is %d\n", buf.packet_cout);6 l; r9 w# C( V0 A9 S( X
count_copy = buf.packet_cout;4 E- B' o+ q7 K
}+ m0 \9 _3 T7 H7 E6 s. ~
else2 a1 b- a9 `; L% U
{* N; P% G9 G- O) l
printf("No effective message!");
0 b. P( s9 b) ]4 k, m9 n. n4 Q, i z }
5 s; N, g) I: s1 O, D7 s}' u1 d- g6 ^) b. ~3 W' {) F" Z: W
. p1 @3 t6 a1 @; h
" I. H7 t$ R+ S2 b6 p4 S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
_- Q$ w3 u$ _( X1 N! S* P使用下面代码,对内存使用了mmap函数后:6 _+ `* _6 N, l P( J! E
#include <stdio.h>' w' S; l# F4 ~; o
#include <unistd.h>
6 d1 a1 E% y2 X: {#include <sys/mman.h>
6 \! Y7 R, U' `0 K#include <sys/types.h>
( y. q# _. C8 i3 r#include <fcntl.h>
% x; h0 m: U+ f X) X# r# q/ `. G9 t4 I$ ~! L& M
#define SHAER_RAM_BASE_ADDR (0x80000000)
, x% F9 P/ z% Q- ?2 [; ^0 }4 Y#define SHAER_RAM_SIZE (0x20000)
, _+ N5 }/ P/ p' a0 d, E0 B4 h5 @. {2 A6 @
typedef struct
" n% o+ W8 W1 w) I3 V6 i{
( f6 c# ~- c6 m unsigned int a;) r& V' m" h. L* b4 K4 D( P( m
unsigned int b;
1 g$ R. d1 r) e/ I! m unsigned int packet_cout;
. C: z! `8 t+ u2 G8 Y& E o8 y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# _9 b- k" w3 g# \! J1 h R
) V* t/ ^6 l" b* J- Dvoid read_MSG_buffer(int *baseaddr); e0 ?/ h3 _: H" S
unsigned int count_copy = 0;& K; M) a+ t$ D. `( H$ P; ?8 S
& ~0 E* s* @$ L0 O1 Z8 a+ |- w- xint main()
' j% n& }0 }7 d2 o: P{
( e) l: B; `( T& O% q8 T% X/ u int fd;
! C, _1 l+ U* r5 D+ s int *mem = NULL;
2 X( R# m8 m* ? t! \, G* X! e$ o. [7 e8 Y3 m
if((fd = open("/dev/mem", O_RDWR)) <0)
2 K# A Z m: j" D8 h {
# K4 n5 a3 q/ Q' u perror("open error");+ G/ \* f9 y" w$ K0 G. g' f; k) G
return -1;& u. N5 w" G0 w( @, \% \( X, N
} N) M4 g8 T9 x; h" v* Z
, U+ }& L/ q) P3 T/ s mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! ? x( u3 A; q* W/ T0 J+ u& ~( E9 p4 N
while(1)1 o% U( [: ~9 `% N1 |# W7 v
{( [: e6 y% V5 O* S
read_MSG_buffer(mem);) @& Q% g- Z! Q8 P$ ^- M. B5 R) M
}
/ X5 |! P l6 ?}
6 i7 [$ B) q2 d) c
+ B" ]2 P2 u0 Q6 T9 O1 h/ ~9 yvoid read_MSG_buffer(int *baseaddr). [7 R% F+ s* S1 L' D/ ?
{- j' s% c9 [- X% e3 ^
pRX_MSG_PROTOCOL pshreRAM = NULL;
# l0 t2 E% L1 `/ i) N/ r
7 Q0 [0 Z& M5 S$ D6 E pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 K# D7 o% Z. z
/ A% ^: _/ C" n8 L2 t1 p7 s7 {
if(pshreRAM->packet_cout != count_copy) \0 F+ C7 Z3 g/ Y/ Y" [) s- N: p
{% `* ~. S! l8 z7 K3 j2 x4 {
printf("a is %d\n", pshreRAM->a);
# E* j7 c+ K, g( Z/ b9 B1 o3 t printf("b is %d\n", pshreRAM->b);
! [! p0 k. G* o, m printf("count is %d\n", pshreRAM->packet_cout);7 I, t$ j3 l& C* n5 l
count_copy = pshreRAM->packet_cout;
z) W, ~ h2 f% B/ ^ }3 ^& p( o3 _$ u3 F* Q
else0 F: P( m' ~+ y) K% z
{- W/ G: j W$ ?, O& [ B
printf("No effective message!\n");# R" A! z. W F5 D/ E. p
}, e( O( T% I O. r0 ~9 B
}* y# N9 c1 G7 m
0 ~; V0 M/ f- w' E" h) q# V
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( y9 O5 R1 t2 t& X
$ j( s4 s& D1 y( q
; r5 k# e, w- a" T; a
& Z8 I( G J! V
f; V O) ]. K; \ |
|