|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 ?7 A3 Y' Q0 k& U. j$ z# v
& g$ a# F. \& T2 W9 ^OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# |% r; x% {& \9 `#include <unistd.h>! Y. Y$ c4 M/ D% L1 a
#include <sys/mman.h>% q: u9 b/ G( ^+ c9 e3 h5 u& t' P0 x
#include <sys/types.h>/ F4 K9 `/ _# `6 r( ]
#include <fcntl.h>9 k/ Z( y+ a# a0 n: o, j8 k3 U
9 h h$ T7 }' b/ O. H7 {* v, v#define SHAER_RAM_BASE_ADDR (0x80000000) % y. R2 M- `; V! [* g8 ^6 Q
9 E' ^) t5 I9 e8 r5 a$ O/ Ztypedef struct/ r: |& C$ d, E- T3 l$ L
{
2 K* [( _6 H0 v3 J unsigned int a;7 D- U+ @) z6 x( ?0 T
unsigned int b;
% C* r, m& f4 S$ r$ e unsigned int packet_cout;7 {' e" ?. B6 D# Y. J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; M8 Y' ?8 G$ H4 D# T2 [ [
& g- J- d7 T2 _0 n, n8 T6 C3 Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 b! m; _7 ?5 r5 _6 m2 X ]
unsigned int count_copy = 0;
4 |/ Z, _+ G- {9 X3 K2 ~. _7 \2 A6 x% \9 a
5 @, |2 ?9 _. d, \
int main()! H8 {) m# P4 \2 {$ \5 c
{; t% y( l* f2 J# T8 w
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ i, W$ q6 p3 V+ K5 r" J$ x pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: A$ w) s* p& h# Q% j# @% R/ J; U, Y5 j n6 p) F% V+ j! k) }4 }
while(1)
& I3 F% j$ o0 D% O, t, V+ |- D! T {2 I$ M) a5 F; O, k3 W; }
read_MSG_buffer(pshreRAM);
3 Q! N5 u' F9 s$ q } d% f E/ Q. v% f o/ t5 m
}+ N* a( E% |3 k1 G
9 k: }( E% z5 q c7 }9 |$ e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)2 y- d. H$ \% L0 g8 v+ I, d1 P- K' X
{5 L8 `* K! Y# j
RX_MSG_PROTOCOL buf;
! W/ J" N0 M. v, T' v- O' k
9 c1 ^8 Y! z* J! |8 ]1 v) {' {9 P! N, w buf.a = pshreRAM->a;: b: I9 Q! o! M, u$ ]1 M
buf.b = pshreRAM->b;4 }# o5 s1 ?+ @5 n) X+ m) X. ^2 E
buf.packet_cout = pshreRAM->packet_cout;
' J$ F+ S% S1 [7 j4 R
7 N1 F# T0 R& c" ^6 Z2 U1 z2 h6 ^ if(buf.packet_cout != count_copy)
; Q6 \7 W2 h E8 F& Y {
1 C: ]/ l q$ Z4 |$ z printf("a is %d\n", buf.a);
; s: m1 y' f+ D' Q& k( h% _5 l9 h printf("b is %d\n", buf.b);
& e; W7 ^* o: t- f printf("count is %d\n", buf.packet_cout);$ U2 ^1 d7 f' t+ {
count_copy = buf.packet_cout;
* p7 t# P+ @7 i$ G3 g& R1 l* W/ u: x }4 Q& z+ x" s" y1 d, ]3 v
else
) Z$ h2 o* U$ T5 N ~6 K {
' X5 |' | @ c7 i" x/ J$ @- z printf("No effective message!");1 m2 ^( x: F( R& K, ~
}' c, j9 ~4 g6 B
}( h( _* [8 Q9 w# g" ~& ~' c: \6 Z
; B+ D1 V, A$ x! r" L( Z6 o' x u O, o) Y3 T1 a z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% N) ^' }8 I/ V5 G/ x使用下面代码,对内存使用了mmap函数后:
0 C' p: w( Z( R2 {0 u#include <stdio.h>
' B" {- ? d! ?' Q1 S0 i1 A/ m#include <unistd.h>
/ Z" W+ C% C! g. x- e q#include <sys/mman.h>
" H. }6 ?: E! J$ @ N#include <sys/types.h>( I4 K' a: y6 v1 ~8 A$ |% i
#include <fcntl.h>3 Z( ]% c( s/ g
) N! E4 e0 F0 a' _- r/ }
#define SHAER_RAM_BASE_ADDR (0x80000000)
( U% u9 z& |9 @6 W! B: Q1 q( F9 p5 _#define SHAER_RAM_SIZE (0x20000) [+ q: F K# Q6 u c
, m$ Y$ c: b) S2 Gtypedef struct9 R( O/ T, y( p" g
{! H9 E& z$ a- v7 H) e
unsigned int a;, C" y; T3 @# L' p$ l8 i
unsigned int b;7 N6 z. s. R3 S, g
unsigned int packet_cout;2 }3 w G# L$ B! ]: K2 I! t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* l- C" {2 Q! v: }4 |$ ?# G
E# s( z: S d! F& X) v# I
void read_MSG_buffer(int *baseaddr);
" G( J: o/ R5 w1 z2 E sunsigned int count_copy = 0;; R+ f6 t3 I4 L1 D
' ?3 r) n, k: C- Z, r
int main()
9 e4 h# t' v+ X/ \. x" j{* v x8 C! C. b( b3 r4 @. q
int fd;/ R' W3 p. m- j$ _2 p9 p4 P' [7 I3 u
int *mem = NULL;
+ ~2 M | d" x7 s* q
3 y. I. \' m1 T$ i: z t if((fd = open("/dev/mem", O_RDWR)) <0)
1 B4 k# @4 k# M$ U9 k b* ^; d( R {, Z' f* y/ Q5 l; Q0 K
perror("open error");4 y- _; ^4 I; ] Y7 F* o
return -1;
6 R% A, j1 s& ^# z }* B: G" f+ s: r( H( Z
! L; H/ E. R' V/ v/ X% V: G5 {
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 r" t, @+ _* Q: X/ t2 F! J0 T0 C' \
while(1)
" E: W2 v3 N0 {6 O/ o {! E( A2 B+ R% G) g6 q4 o3 W
read_MSG_buffer(mem);
- i; p! r0 P' m& ~) Q1 T; ? } % W5 ], c. f8 z
}
8 Y+ \+ `+ w" A5 S: I1 _3 ?' L4 t
* i. v- a" ~( [3 P# P; Nvoid read_MSG_buffer(int *baseaddr)
6 @/ z" H/ F6 o{; ?, t0 q) n, C1 I ^
pRX_MSG_PROTOCOL pshreRAM = NULL;: M& g4 p# y+ Y4 h/ D, y
! @* q" D: W. V8 e pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& u7 Y, M6 x; { p& [" K! N# _! n
if(pshreRAM->packet_cout != count_copy), J4 E7 W8 Q C/ E$ q% Q7 |
{
* Y& \ \ ]: M1 X" q printf("a is %d\n", pshreRAM->a);
; e# \ P" C8 M' W: z; m0 J printf("b is %d\n", pshreRAM->b);
# ]7 K [" ~3 b) A( J, ^& L printf("count is %d\n", pshreRAM->packet_cout);8 \% T* A- w6 a7 R
count_copy = pshreRAM->packet_cout;
( j$ y) h$ m% s0 _. @ }2 e' \0 c( D' _# i/ h
else- i7 T6 S1 E7 I& U5 @
{: L3 f1 o I* Z; z8 _
printf("No effective message!\n");
! x6 N5 n% P1 n }
" T. I/ f" q# i+ C+ R}( x+ R! l0 Z! F0 x
0 T& o% y( o8 |! F* h# t% q% e2 R
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???5 v% w+ A! F- M2 o" @' w
3 J$ G% L& o6 `3 I
+ j* L' P/ j6 Q* u6 }/ M7 T' i+ C5 s+ r' \+ {; {
$ ^- ~$ m/ @: V |
|