|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. O A! S! n0 s5 { W0 a- p+ C9 @% w5 e- X( `3 C# N
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ B" G4 f/ B& n# M$ ?9 d1 y, p#include <unistd.h>
! w" O" w# X4 s$ F, x A1 X E) T+ Q#include <sys/mman.h>
' X: L, A5 \" y6 V" D" i+ H#include <sys/types.h>% W" J8 \: n# z5 g
#include <fcntl.h>
' p1 L/ ]. F4 H0 P6 b$ c$ ?) H: m7 f- K) `' M- S( W* f. W
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 d2 A$ F% P& r+ T6 h. a- j7 _6 Q- \ m! F$ s8 e
typedef struct5 h' Z$ A' Z. G0 e
{* V; ?* N9 m* L; E
unsigned int a;
' }, d7 q. u& C7 m: d) g unsigned int b;1 R" {0 \# E/ E
unsigned int packet_cout;
% t# P# ~+ r7 y3 n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, D8 @7 Y& S) z% o* T3 ]
Z( u5 l9 r5 v1 v7 d4 xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 J, _, m3 Z" F; X6 x/ Q6 _unsigned int count_copy = 0;2 j# N9 W2 v- `; m8 ^
- H# g3 G' J ~) r4 o ~7 Y
! V5 n1 c2 Q: ?- t3 fint main()
1 ~6 c0 B7 ?0 V$ r& V{
7 ]9 N' `/ e' D* [ pRX_MSG_PROTOCOL pshreRAM = NULL;( |9 o5 E" r; [. V% H- `. s
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; f" ?5 {# ^9 V+ e9 D. N
$ b/ |& k" O0 j+ T
while(1)
0 H+ t, }; k! \7 z, b; O7 z; z- ` {
( L) W& ?% J. j M' l7 ]. J read_MSG_buffer(pshreRAM);
: Q! d) r. U) d) M; K1 ~0 r) B }
5 N5 y" j$ a' E* D; G9 l}+ p% A+ V6 Q% p( A; H
c6 j) h% [+ ?6 J4 G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# t. R5 S* a9 B/ W9 n( [0 A' t( V
{
4 g' `, e0 m7 \ RX_MSG_PROTOCOL buf;
! y# f6 X/ v9 h- g' P' ] # K, c, r& |+ a+ f' X# N/ E8 K
buf.a = pshreRAM->a;8 v4 S8 q/ [% d) A/ B; {! |
buf.b = pshreRAM->b;; c0 Y5 o) r/ i/ G v9 n
buf.packet_cout = pshreRAM->packet_cout;1 l% b; @9 g3 U V$ v$ i
" t* l' |$ [, w1 \8 X A8 h' N
if(buf.packet_cout != count_copy)
$ f% i. m' Z" n% y: { { d" n0 y) }6 g& [& h
printf("a is %d\n", buf.a);" O+ V% ?1 S7 r: n. {% M
printf("b is %d\n", buf.b);
& ]* X! N% u2 W' B% O printf("count is %d\n", buf.packet_cout);: W B+ F6 Y# |
count_copy = buf.packet_cout;. M# e5 Q, B2 Z
}
$ k$ n i7 F V+ k; M5 S5 W else- Z" ^7 c( R) c. D
{
+ b5 Q: k% |/ f- J# D printf("No effective message!");
3 V4 N7 D# K3 F m' l9 h5 o9 i2 m }
9 `# V$ |: q x1 m9 R}
& x6 U; E* i/ a8 U m; }) P: E
; f N; o* }1 C$ n' d$ i3 a( {
5 B5 y, p! R3 n% e) [但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- E0 t+ s' r$ N* A( U/ v" |使用下面代码,对内存使用了mmap函数后:% _; b+ n w. c) g$ |! z
#include <stdio.h>
" x$ N9 p4 D. \- {- l) t4 W$ n#include <unistd.h>$ {: R8 ^$ t6 C+ t+ c7 x
#include <sys/mman.h>
4 b! x+ X7 e5 Z& E#include <sys/types.h>$ z$ g: j/ n6 L# P/ j
#include <fcntl.h>
+ o. @1 F* }4 c0 T7 }6 x0 G: f( G! B
#define SHAER_RAM_BASE_ADDR (0x80000000)8 i, w, \7 Z0 J0 T8 l) A$ J
#define SHAER_RAM_SIZE (0x20000)
3 _3 o: B1 P& s9 _8 P/ l& p, ?3 M& [
/ } Y" W) C3 e% x% v$ U8 htypedef struct
; r+ \9 z8 V E" d) ?. ]7 s{: y; S" {( Y* ~) l
unsigned int a;
z% {; M$ q' S9 D+ p) k$ }4 {0 r* C unsigned int b;$ c+ V: K6 M( w# o E$ f8 K
unsigned int packet_cout;7 ?7 r8 g6 ?( I8 \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; L0 A% X: N: _, b" a5 A% t. S- b
6 G9 u4 z% F" b- ^( }void read_MSG_buffer(int *baseaddr);* B6 W/ d9 F; D" {
unsigned int count_copy = 0;/ c# o7 i" }7 u, U: p
" |; G8 p2 Z: B& r
int main()
5 q7 Y; i2 C- k/ B9 z2 d( @7 W R- |7 W{
+ |5 ?- _! J" x int fd;
8 `0 Z! F' i' u" ?4 {. e int *mem = NULL;3 Z }: k. h! X' }+ [4 l
* x" g+ H" |3 ~" U8 x1 C- ?
if((fd = open("/dev/mem", O_RDWR)) <0)
; |8 v- e+ }" w9 h. y" d" L {2 X$ Q v/ a8 s G
perror("open error");
+ D5 R* R0 E* e" Y& P) D: l% ~8 z return -1;# F* M/ n1 w5 N7 F
}9 C- C3 o$ U F& m; Z3 P( `$ C8 x
" U2 C7 ]5 c* i X9 b
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. s/ `2 c6 K% Q+ M+ f5 j
. ~+ g; X; Q E1 \, \ while(1)
! _! x% z/ R3 w9 b1 j1 F$ o% M {
, I: |3 r/ v2 ^! G0 \ read_MSG_buffer(mem);
$ Z" g8 T6 H! G$ Z1 E- j& u. y2 @+ G } 0 K1 q: r- X0 b) k. |/ q
}# g& d7 O, ?! D4 W9 k
4 v( m w. X( F3 c; Z8 a6 Rvoid read_MSG_buffer(int *baseaddr): w# j# n8 R$ f, R: @$ I' j
{4 i9 b- x8 |- k
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 Z7 G `: G# C4 z4 }" s! d: h6 {" Y, V- X$ x- H1 m- \
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ P9 F$ P% w% r7 P7 ?' s( D3 y$ `' j5 i
if(pshreRAM->packet_cout != count_copy)
: H3 W- z5 m/ Q6 ]* ]$ @! V {8 R4 a. K, B1 ?$ B& Z$ ?
printf("a is %d\n", pshreRAM->a);+ m' l7 Q9 Q! J# O5 ^
printf("b is %d\n", pshreRAM->b);
0 y U. G' Z& e: Q printf("count is %d\n", pshreRAM->packet_cout);
* I9 V( o% x- h t: k+ j+ f' ^ count_copy = pshreRAM->packet_cout;
! W: W2 Y, F5 f% o! u2 e" k, W+ e3 O" C }& K9 e1 k( t. O) x( {/ d! V
else8 r) K: B: o% A( m. r6 k
{
* K* @% R/ n/ {. C printf("No effective message!\n");: z/ c5 {6 p* }7 g
}% { U6 x. V3 h" w
}
6 Q/ ?& `1 B+ t' B4 b
8 c( i2 i1 n1 W2 s4 n9 U没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 m/ a$ a j' ?. H1 u! O5 u5 Q9 ^9 f7 x- S0 a, ^1 ~. w) H- Y4 @
, C& A1 n- @" p- S: t- g- e4 _% l2 W6 p9 W. ?
4 c! s. {: G3 M" T |
|