|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & M+ L& ]! K7 S/ k( h7 ~ }5 S5 s3 n7 e
\ T$ a0 }5 ~% W) F" Q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) j0 u. Z7 L- f2 T1 B) A9 W
#include <unistd.h>
, M0 p: {2 I/ B( [# Q#include <sys/mman.h>
5 A( s1 K% g& _: W#include <sys/types.h>
" B' N* {0 O3 e) p! N5 P J#include <fcntl.h>9 K; B9 ~7 i+ j8 j+ m, i
6 \0 E( L: o; G5 f
#define SHAER_RAM_BASE_ADDR (0x80000000)
- Y1 f+ ~9 Z/ I* L7 W$ Z2 Z6 D5 b5 D5 D, D. H1 v
typedef struct
/ V8 N( [9 l! C{7 Z H. W- Q5 i4 v' i
unsigned int a;
5 L+ m) O' ~. n' R- R/ q unsigned int b;3 l) l6 b3 D: `( D* e4 D" w1 M8 W
unsigned int packet_cout;: Z' S4 E) w# j1 d' `3 Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. Y, B. _6 ~" `( a% C8 O: }0 ~0 r9 p/ U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 M3 }; Q( x. l; v; _: s$ vunsigned int count_copy = 0;
9 M; b- y% l6 v. x4 U) \- [' Q: t, {! K% O; h+ x+ B
: a- u9 b, E3 V# O7 k" [ z5 ?int main()
+ `) x( ~. S$ u8 d. ?! ]{
3 v# D4 p' q' K: ]2 f pRX_MSG_PROTOCOL pshreRAM = NULL;2 i" B! Q a% f. l
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;" Q+ e. W+ B( Q7 {/ f& }
- Y) F2 b5 P2 \ R
while(1)
2 L( g) @3 j& }) g {
$ j# f' Y* Y" M read_MSG_buffer(pshreRAM);9 N3 c8 J* b q' l
}
0 o$ a2 `* g* _+ Q8 \# \- S P' j" Z) a}0 ~4 E6 e* \3 u7 P
: D. y5 _0 f" w+ a, i5 D% H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* _; f1 n' k2 _+ s+ u( d% H9 o
{1 I7 U- H% J+ ~ s* c9 P
RX_MSG_PROTOCOL buf;
8 A! s D' S+ v* L) X& j# L) D 5 W+ I! O1 ?; [$ o: x4 r0 P, `8 b
buf.a = pshreRAM->a;
" x: @. x* H6 u& C0 U buf.b = pshreRAM->b;
# O7 Z2 [& ^5 N/ l/ R buf.packet_cout = pshreRAM->packet_cout;1 H5 H9 h$ w* o5 Z. P: P8 ?
% d3 h, v! J. J; x5 a8 Z; } if(buf.packet_cout != count_copy)7 ^8 [6 u: I; G1 i8 B# Q
{
6 s+ y0 z3 n& F% e! B( ^+ b1 F printf("a is %d\n", buf.a);
. A3 h; L# s& A# ?& J" r- ] printf("b is %d\n", buf.b);5 u+ l- b Z0 L0 G3 k& a
printf("count is %d\n", buf.packet_cout);
. j r2 ] ]9 u, ^, S" Y count_copy = buf.packet_cout;; y: u- y+ f& U
}( q" a4 M7 N/ f
else3 W( k% n- P! }
{' I, A: v: _( {5 p% h3 ^. H
printf("No effective message!");! g& P# S! Z: N* s: ^- J
}. A5 @2 d/ C1 }( Y( O
} i9 _1 B9 L6 L% U+ s; Y
9 t9 w, v" R$ g5 a# ]+ F; f, l. K H. c, m% v( A7 J1 I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, }) G0 J( t# U( d3 L" h使用下面代码,对内存使用了mmap函数后:
; Q9 Q7 g0 v( ^' r2 |$ \#include <stdio.h>
- W$ {0 ~$ u0 v- |* _. J2 T#include <unistd.h>
( D7 V: M) ]/ k; k7 w: P* R* r: \( j, M#include <sys/mman.h>$ w" ^: e8 @: B
#include <sys/types.h>% I' N' S+ y% i; [1 a
#include <fcntl.h>
5 n1 e# {5 [( P4 [; ] ~+ }' ~
( Y- W0 j% H, `3 o4 L: Z# f#define SHAER_RAM_BASE_ADDR (0x80000000)% m+ L7 j: F) ]. b# N# {) ^
#define SHAER_RAM_SIZE (0x20000)
v$ g8 ?- N# s3 s" `
1 K/ v, J* Q: H1 h2 ztypedef struct
9 j! A0 D2 k$ b6 g" l. I; j% ]{
, I, `0 ^8 a; W8 v7 t; N/ h* Y$ q unsigned int a;
2 \* ?, U9 }+ ^, q unsigned int b;5 v0 _3 r: U+ n' k9 ~, A: g
unsigned int packet_cout;& {( ]" E' E J' O3 ?+ Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ R9 n. ` i4 v' x
& X7 {0 ^( z& @: [$ F9 m+ P- E' gvoid read_MSG_buffer(int *baseaddr);% X/ F8 Y- s2 P' m& h7 r. X0 g
unsigned int count_copy = 0;; {0 {8 L0 x1 c3 \- i1 A9 X
9 F j8 P& z. \9 j& V
int main()
: k. P9 ?& ~# Q{ L" L: _: k5 ?( C& I5 h3 p; {
int fd;' G: i% J. n2 G5 m- a
int *mem = NULL;
: o) Q8 I0 R/ e5 [& S. m; ]% ]7 w) w, H/ [9 m. e
if((fd = open("/dev/mem", O_RDWR)) <0)6 m# c; E. _, n* T$ [
{
e4 }# Q& a/ ^ perror("open error");
# O6 q2 ?# k4 e! `0 W# d8 a return -1;
- J9 t5 x, r% F. z2 ]: S( U }
* V' \' O+ d1 e* A& M
1 v% C& d9 m3 w; }. U2 O mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# N% C- r: b0 g- j2 d. b
, s4 b$ x' d- J9 P3 @
while(1)
9 C8 S, A4 ^7 |8 S9 k {# i1 @6 w3 s: n" C, y6 F( E
read_MSG_buffer(mem);
( H# E7 _0 r! l5 w0 S ]# u6 S }
& S. o- m% d. o* R) @5 `# t9 f/ h}' r* Q# H" \ x
) o+ w6 \: l* [void read_MSG_buffer(int *baseaddr)
" f# u3 q4 ~6 s1 Z{& j2 D5 M" T* a! Y
pRX_MSG_PROTOCOL pshreRAM = NULL;
, L$ e" b- e& |* A6 x
9 C; z; t8 T5 z4 D" ] pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% g/ y: M W+ }) e z O
* ~5 K g( y$ \ m1 N) w z0 n
if(pshreRAM->packet_cout != count_copy)
& j+ S' U9 O9 L) f {
& \. i) x6 U7 x& ]8 X4 n9 R+ Q: G printf("a is %d\n", pshreRAM->a);
/ N6 X5 v% l+ s& I! Z0 j& H printf("b is %d\n", pshreRAM->b);& X( G/ \8 L( L
printf("count is %d\n", pshreRAM->packet_cout);! L+ |6 ]' Y/ V" t. |1 R, K+ `
count_copy = pshreRAM->packet_cout;) _( ]. H1 L, R8 r
}
1 {6 \ k: P. r3 [- p: y! M" D, Z else
, V" N( ^; ]* O( `. p {: |3 a( S. z1 M' O+ `* K( |
printf("No effective message!\n");
# V5 h1 D+ P. Z) M. [- N" V }
& h5 j2 ^# v! g; f" f, x' m}
; T5 s5 r, m; e# F7 N' A# } ~ s8 o9 b& w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 O1 W! E: L. |8 W) M! |+ N1 \, n' l
. B$ B; |9 {8 C Y6 z
. Z: g% ^+ k9 C6 ]8 @1 E% U# B
1 O6 P8 }9 Z5 G; k. ?/ ^ ? |
|