|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 E1 D) Z3 C& [% p) U
6 U+ g9 q( l1 R2 @9 e0 F7 U% _& u
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ F- ]! @" ^$ a6 s G#include <unistd.h>1 G7 z6 T# a* t: X
#include <sys/mman.h>
, ]! v8 R/ n3 S" K& A4 @8 H) b#include <sys/types.h>
5 I6 n# U; q3 I( O0 h! [2 t3 x$ e#include <fcntl.h>
u& S. |4 a. C7 p: }5 m$ v: i0 _) Q1 {! N6 @; Q, z7 m& t
#define SHAER_RAM_BASE_ADDR (0x80000000)
& Y/ E" m. W7 U, X: G" k. U' L' G4 ]% |! E0 j+ M' C4 ~
typedef struct
+ c5 I6 h5 C9 s2 M6 C, _{2 s+ }9 j8 I9 y. P' y" W+ v
unsigned int a;
% y ]6 X G7 L, B unsigned int b;
' f% ~/ t6 k+ ?, X unsigned int packet_cout;
5 l8 T6 u0 `6 d5 n. @3 {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 d, E3 \: j& v4 k- Y3 S* s
& Y( G7 B6 Y+ ~1 b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. I# _. z( F* e! H7 uunsigned int count_copy = 0;
" I7 E7 D, i" ~0 I# ]/ G
$ i% l, o6 l. C. p9 k$ n
) g# j6 A9 R. `& ]0 s* f" Iint main()* @/ F) f8 {* x2 F* f; ^
{
* ~9 O) O7 b) j pRX_MSG_PROTOCOL pshreRAM = NULL;
5 _! x* d4 n) a9 m% g9 g pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
' ~5 G+ ]& P& P% S! p, b. I$ l% e! j, b- `8 E8 W
while(1)
; |/ `, D1 V* B {1 U i' G0 C3 _& b6 ]
read_MSG_buffer(pshreRAM);, G' ?! Y+ x6 A& |& o6 F/ m' n
}
0 |; u& l% K2 [- D8 H) K}
% Y; k# p" O' b0 x1 B% N. V7 C. i$ u- q6 u8 V$ p7 |& w% S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ H, j. m) ~9 |8 Y' k9 F6 i3 g2 S; `
{0 w9 b5 R% j+ b5 V- {9 M; z7 v
RX_MSG_PROTOCOL buf;- V- @/ x) v, C0 d
1 T' N5 a3 e- U! a7 T buf.a = pshreRAM->a;
! \, d+ a8 p+ s& n) F' x1 g) ^& l/ K buf.b = pshreRAM->b;
* N, I* E& ^8 j# K buf.packet_cout = pshreRAM->packet_cout;
& B/ ^% E8 X. s" W. m5 E
, f/ V, v& s. d; n0 q if(buf.packet_cout != count_copy)
. \! y9 k) r( i# R9 \6 A! V {& Y5 H3 ^) {" |1 Y
printf("a is %d\n", buf.a);+ H! W! k# U4 F1 n- e
printf("b is %d\n", buf.b);
4 u. Y/ R( S: D5 @+ z$ H printf("count is %d\n", buf.packet_cout);
5 H- T# e3 }8 s: o. G# _ count_copy = buf.packet_cout;
% h, {% r2 G3 J# W. T }( r8 x/ k* \ {/ {! [3 ]
else& S* S- U3 F- [9 M
{
) |* c2 L1 Y* J% p7 ~ printf("No effective message!");
/ d; }2 j- f' ?" N9 n }
/ A+ ~5 ?5 r: A E% a6 i' b# b}. Z' T; G$ K' H; V9 P% r% x5 o
! p* Q9 O% j: w
8 [/ Y2 q( z# F; ^- ^但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, v/ H2 h* a5 ~+ y( _
使用下面代码,对内存使用了mmap函数后:
( c @& m* c% n( z& z; {#include <stdio.h>6 _$ H0 |. @& @; h# w
#include <unistd.h>
; W7 w' i3 T1 Y- [5 v6 B. j#include <sys/mman.h>
, F% a! g- `5 @ W" a1 ? m0 K#include <sys/types.h>
4 o* L$ w9 H& Y- W0 p#include <fcntl.h>' L2 I6 e- k9 ~; q9 [
& T# ?4 `6 A$ p1 H/ v#define SHAER_RAM_BASE_ADDR (0x80000000)# Q0 D: o% Y3 Q
#define SHAER_RAM_SIZE (0x20000) 4 v+ w3 L1 J" u4 W# w" O& }
( I# x3 T. a5 g! Ptypedef struct
3 D+ f! A6 K5 N. F{
/ F3 S. R t! Z/ w: I2 A: C6 ^ unsigned int a;( U7 v' B! e( M3 S, u5 N0 v
unsigned int b;# f& @, ]2 F4 D' n0 h
unsigned int packet_cout;$ \3 J5 r6 @1 A* h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, o8 j2 W3 L) s3 {/ T
$ ~0 Y, j% S3 a+ E9 g: P, Qvoid read_MSG_buffer(int *baseaddr);, y$ D2 ~) N$ Q3 D- R5 E
unsigned int count_copy = 0;
; t B. w! M+ \+ p0 S% H+ w8 d* Q% n4 i; h2 H
int main(), ~% X. d( O* W2 @( I1 K' e& A7 ~
{
" {+ [7 \$ q$ u. L* h int fd;
0 `/ X9 M3 \4 A int *mem = NULL;
) z' x. s- g5 M; n/ x
1 G' u# t: w! s3 I- n! y/ F" _* {0 T+ v if((fd = open("/dev/mem", O_RDWR)) <0)8 q" q. T- v8 S# u; i
{8 ], ]" T. M; i u C0 h/ d) z
perror("open error");& x8 F5 U. e$ A; h3 F C
return -1;
2 a$ _4 T' L8 x) P k }1 }9 p3 S" O0 Z4 j6 F3 G8 y
/ d; P- ?6 f, }: B e; l mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 q' A y- v- e1 c5 w
3 j, C C( b' Z5 h2 p while(1)- s8 g2 J W' M ?) J9 n" t' p
{$ Y" A) `& x( p5 {
read_MSG_buffer(mem);
7 @0 J! I I2 |; |+ Y! k+ @/ L }
+ Z0 C3 @ f$ S" f& U) U; Y7 k6 N}% {) G9 y. O+ U- W
& S6 g" O/ k( n3 O6 K0 h& l7 Hvoid read_MSG_buffer(int *baseaddr)% s6 h! p1 o( e. f, e/ u
{& c8 Z# j% i5 t$ _9 E/ R
pRX_MSG_PROTOCOL pshreRAM = NULL;( e* O0 U. ~5 U7 P% J
4 B+ {, E6 W7 j3 G0 U, Y+ I
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! K) L) _# w& Q9 a* ]8 Q+ {8 q6 _ l' B& h6 Y- [
if(pshreRAM->packet_cout != count_copy)
) `. U1 g F4 a6 w5 j {$ V, S1 m+ G/ I. t# R# ?+ d
printf("a is %d\n", pshreRAM->a);" x9 j X# J* X. ^/ D, g
printf("b is %d\n", pshreRAM->b);
/ G: o* J- F" }; W) w2 r, e printf("count is %d\n", pshreRAM->packet_cout);
9 R" p; c9 J! D% Y* R count_copy = pshreRAM->packet_cout;
6 w5 v" W2 h9 Q, T }* ~ M* t; W/ c3 Q, H8 h
else0 Q, |" G# a6 P2 [$ d; I
{$ R( o5 `1 N" u; S! q; f
printf("No effective message!\n");7 a8 \6 k |* n. t
}' G9 b! k& y- y+ n9 X. a
}1 k: S0 y% V- C/ q
4 u& }& N2 d: N& }) e; x没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 E, P8 B2 n( `& A5 z, O4 a* T! e- w
6 v S( d4 c- Y& e3 }
# v; l% Z& k4 R' L8 t S4 l; L! E7 Z) m
7 x, s; y& R. p7 s& {& Z8 G3 u: S/ b+ y! b
|
|