|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . B! m9 \" t8 E1 ~8 g9 N6 c
/ `8 ]( h9 N0 Q/ d' w4 bOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 v- j# b3 d; \* o ^#include <unistd.h>
0 K5 m7 Q2 A' b R+ l#include <sys/mman.h>( s) ~/ E. s' Y& k7 a( Y& q5 T
#include <sys/types.h>- F) @$ E1 U2 t% W7 D6 o
#include <fcntl.h>
1 L _" C K3 c
" [! h! s' `2 F$ I4 I1 {#define SHAER_RAM_BASE_ADDR (0x80000000) ( {( \3 X: ?* M& O4 o, N$ x
# D! i5 ~* r0 ~4 O8 G- S9 A
typedef struct
/ D8 ]* X/ P( o9 Z3 x a2 X8 V{
' c" K: E% O1 F- y. H+ R. q unsigned int a;, l" [/ w, D- l" H5 T& c
unsigned int b;
. Y4 p1 f; Z: T$ Q) h unsigned int packet_cout;
( T1 X1 i2 p1 j0 k# H" @$ n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ C& f7 ~8 t' }- J: e# t
( Z* z) B% w( s; C) S2 avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 P6 H. g* m/ W
unsigned int count_copy = 0;% I1 {. e& X6 T3 a4 M
, L$ w' {) v0 ~/ j5 P
; k; A$ J- O/ h. k# g4 C) lint main() i9 l& O: M5 B& p( ~3 H
{7 b; @- B$ `9 W! Q$ I
pRX_MSG_PROTOCOL pshreRAM = NULL;0 T! w4 i* }1 H4 F2 j; t5 H. ^* e- l
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ F# k$ ^3 r! d( N! f) C+ o6 _2 E' e
while(1)
p" q( a% d% |: ?. s1 I" z. s {! b% K! h: w& U0 `0 H' i3 n
read_MSG_buffer(pshreRAM);
. i1 z2 O# y* t- ^( v } / r9 w, n. P, w3 M
}" m" J* a1 V3 e% T/ Q4 Y2 k
1 ^2 h$ K+ l# b+ }8 Q9 O P9 ]" k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
u1 F( i& i8 [5 ~: c D1 |{6 l3 ?2 e7 M8 Y" W
RX_MSG_PROTOCOL buf;: {+ ?. p: r. y# W* {9 N% r
& J. w: c, S& l0 \2 H& u3 O
buf.a = pshreRAM->a;
' R5 a4 V% [' N3 Q buf.b = pshreRAM->b;, b- r) l$ R* c* A7 E9 J5 y. ~
buf.packet_cout = pshreRAM->packet_cout;( s2 I5 L* @6 j% @7 p- r" M
2 W: s O( x3 ] i7 H
if(buf.packet_cout != count_copy)
7 J# I: E$ z* J/ X) z5 ]; M {* V6 l: i- m* }5 X4 k' B1 w
printf("a is %d\n", buf.a);
2 c0 L: }6 [( c9 q/ X printf("b is %d\n", buf.b);- C* t. F3 R- m( K' Q0 c9 |
printf("count is %d\n", buf.packet_cout);
1 c+ ~7 {& ^5 Z5 o# X count_copy = buf.packet_cout;
4 V$ F/ W# E$ ]) C }' p) h/ P5 g; d
else
: Q8 _$ d9 K7 ~0 O$ c i# @ {* G3 ]& y9 u' O( Q& W. K+ Z: m
printf("No effective message!");
# e8 Z2 a T! T! m6 R. m' B }% E5 ]! g6 Y9 L& u' m
}" a" ?% E5 @2 r8 v/ W9 d! c1 r
9 G0 Y/ {+ _ U' A; ^
: I, [' X; ~1 C9 E, w但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 L5 X R, M! \5 ^9 R7 y使用下面代码,对内存使用了mmap函数后:% k) X, N4 \6 F! C
#include <stdio.h>+ l3 S0 b. N1 a( Q# t% V1 l' h
#include <unistd.h>3 Z+ Q5 }. `. S5 n
#include <sys/mman.h>
* A( |( W/ j( ~; z0 `#include <sys/types.h>
W0 [ a3 O5 `1 e4 v2 v+ e& c. h3 f#include <fcntl.h>, B& d, u7 @ Z5 S
0 N, K- v: g5 ^& O- X
#define SHAER_RAM_BASE_ADDR (0x80000000)- U) {/ b, O; g4 g
#define SHAER_RAM_SIZE (0x20000)
- n2 p- `3 o1 V2 y u. K) R) C/ V& |2 t! H( U. Z' j$ P
typedef struct+ B6 @0 ?& K/ ?: `
{
' s% E' N3 f. Z4 a" ^6 A7 b+ M unsigned int a;5 L$ A _- u* }( y/ a" `) y# Y! r
unsigned int b;
) ^1 n2 p3 e1 L; [' | unsigned int packet_cout;
/ x; h, A, O3 `1 |* ~}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( f8 a6 M$ {# S) K5 a, Z$ ]2 G
4 j- U8 e2 V3 l; C# E% c6 W6 L2 Zvoid read_MSG_buffer(int *baseaddr);
k. B3 {9 j F: g- ]unsigned int count_copy = 0;6 d2 [( @) b/ T# d, G1 k
, r9 g8 q6 j9 f- |
int main()
! L: O$ y4 c9 @$ f8 i" L# c' ~3 P{
% L: @0 s f: a8 s- G int fd;
0 d3 o, ? F6 T8 Y5 R int *mem = NULL;0 R6 w) O9 t( j+ s2 U7 r
( @- x/ L$ J" z6 ?, h' v if((fd = open("/dev/mem", O_RDWR)) <0)
# f5 e7 @% j& \" r" k {: k1 E4 m4 p( [/ G3 N/ v x' p
perror("open error");9 u" `0 Z1 |: y/ [
return -1;
8 O9 @' _# g* i$ C }
' M% Q9 q* z% s5 f( w, @3 U
7 M& c9 l4 t) z( [! S mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- f7 u2 E. J; i5 u. P3 G0 Q% o' v5 {2 o' Q# A1 {; }. ^& l$ O' b! k
while(1)8 {$ e8 t; C% n& k6 B
{' M. e) g# J* A% b2 E+ w$ q
read_MSG_buffer(mem);
% A6 Q* [. @" ?8 W+ L } P8 \7 N0 d) V6 `5 |, f
}, Z V# c- ~: S# L+ h6 i
3 C; u+ R# |; u+ q/ p( P( M4 [& @void read_MSG_buffer(int *baseaddr)! e3 Z4 b# \$ e
{
J v* D. p# @; x2 U pRX_MSG_PROTOCOL pshreRAM = NULL;6 d* G7 U5 P7 g- z
_, O9 C% n; K ^
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' [# V$ r) r4 u1 n2 P" s. s
" }! T4 t; e3 k2 _% u; q if(pshreRAM->packet_cout != count_copy)
4 y( |: O4 F9 i {) t/ ^/ E: c+ }
printf("a is %d\n", pshreRAM->a);
+ h4 @" H7 {* @" G4 O printf("b is %d\n", pshreRAM->b);
& O) a i1 f5 E x! j3 s printf("count is %d\n", pshreRAM->packet_cout);
; d+ G8 K, L2 U& D) ]8 m count_copy = pshreRAM->packet_cout;6 k+ w( H6 K2 S7 X
}
7 J1 e3 p1 O2 R5 @6 d7 a else
+ F V) \1 k: e! G" y/ ?! Z {
, K% @* [* y8 H. b4 ?9 j- [) ` printf("No effective message!\n");
) C+ r/ b5 E) W( m8 D& j }' |4 @( R' m( n5 H- h
} C. Z6 g- D- A, _
4 n7 B; {7 W* O没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ v" q2 H% z6 I' |* o+ \/ A- q7 R7 E
5 U0 m6 C' q& ?# i' e, M
4 p$ N8 x9 v) J: {( K7 @
$ J, E, E4 m/ Z9 R9 B5 A- c& e
' d2 |5 }3 N* P; D+ u& Z |
|