|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, X, v$ X/ h; G$ e y( b* [, o% q9 k& N2 U
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. [9 j; i2 x6 T7 o
#include <unistd.h>, Q( R2 B! Q& k
#include <sys/mman.h>
v; h, w/ B& U- v#include <sys/types.h>
0 }$ p" P* `, D1 L#include <fcntl.h>
4 l: r# _7 K3 {( H& F' Z( w% M: k+ _( {& R1 ]
#define SHAER_RAM_BASE_ADDR (0x80000000) ' \2 `& O& Q: W4 ~
' g8 f2 Q3 p {! [8 S% U
typedef struct9 a; Y' I' B( y- |
{
: _; @3 K; \, |( h unsigned int a;
1 @$ _, ~) `2 [; B1 g: p4 d unsigned int b;
7 J& T1 B& _5 Y& v& w5 U unsigned int packet_cout;- B8 Y' c# r, d3 ?8 S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 g" [! r0 W. {8 I+ o
7 n. X& v7 V T- n- |+ U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" {3 s6 q" W2 i( ?' T
unsigned int count_copy = 0;
0 A' G" n- h& l/ c. j( M9 ^! Y8 l. A* Q( g/ ^ o
3 z" T2 C# }# y$ h9 R sint main()
: K8 c0 b1 i. S* Z5 A{
. K* X s, k* l- R pRX_MSG_PROTOCOL pshreRAM = NULL;' m$ J2 Z2 g! p
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. T6 L0 a' B. S, W3 F
% ~* O3 t! L- r while(1)
; ?- L3 ]; J4 D9 s1 }" T8 ` {
, @" l2 }7 v4 ?" w read_MSG_buffer(pshreRAM);2 T8 i: m( {5 y; o: ]8 ]
} # V7 y- p& j$ K4 }8 S
}% Q, T) B) a& E9 Q, E _
: x" q9 r2 l/ K+ ^+ q, t% H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ t+ m2 N6 G9 p) o" b8 d{
: R. a) v- Z0 p) y4 k, A RX_MSG_PROTOCOL buf;; `6 e! {" U8 z& A
g- }, o0 Z. T" P. L O0 {4 n buf.a = pshreRAM->a;
; J W! ^0 O2 ]4 w buf.b = pshreRAM->b;5 Z9 I9 b( \9 g+ U+ b! g
buf.packet_cout = pshreRAM->packet_cout;; X8 \" S% a, H$ s" G9 G/ j
1 |7 g2 i2 h) y# t3 r if(buf.packet_cout != count_copy)
3 J% k0 ~7 d$ T% n9 p {1 y4 q2 t5 t' }. W
printf("a is %d\n", buf.a);1 d a+ `4 v k0 t. H
printf("b is %d\n", buf.b);
6 K$ O! g& Z9 A0 i, n0 n printf("count is %d\n", buf.packet_cout);% J) R6 \( ?: ]7 f: e7 @ f1 n
count_copy = buf.packet_cout;
# t0 r& W% R$ g# O( W }# [5 d) m( {+ }2 h6 i: m) P& Q
else7 r" g: P" q4 f
{
# U7 o3 y" I4 P. ~) T1 ` printf("No effective message!");
6 k4 a2 n1 M4 B, d* ^- \* q }
/ h+ Y& s5 t( t# G; w9 P}5 q/ }1 E) E/ k& e+ a) t- ?
& G& e+ h3 _% @7 L, F+ L' @- Z
& T v* w% W ]$ @% q! ^ X
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; U- {8 u+ K3 u+ x) c( s8 O4 X
使用下面代码,对内存使用了mmap函数后:
- r: X: k: x% j' A- v#include <stdio.h>/ @2 U( v- n' S+ q4 M2 B5 C5 [
#include <unistd.h>% R! a! L* s# N! L9 s
#include <sys/mman.h>
7 R' S; `$ [. `* g( l#include <sys/types.h>
( C* z! ^5 I) _* K5 S" _& i#include <fcntl.h>0 ?+ J5 b- h5 A0 _0 x
9 j) G' a) m, R O" F o6 G
#define SHAER_RAM_BASE_ADDR (0x80000000)) w# h. Y8 e! S' O" A& J+ r2 w
#define SHAER_RAM_SIZE (0x20000)
; M. B Z- ]8 `% |$ ^4 {: [. z; J$ |# t8 C
typedef struct/ \& v) X+ p- z4 m1 R
{; m) M; o5 V# z! g. h* i. j
unsigned int a;1 e! d6 ^9 a6 ~5 [1 b
unsigned int b;
7 H' o; U. x8 c& S' c1 N unsigned int packet_cout;+ |- s8 E; W0 c ]4 O6 k9 C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! s4 C6 y2 |1 P" ]9 V
) O. I% {; o5 D* C* Hvoid read_MSG_buffer(int *baseaddr);
- t0 V0 _: h# S3 ?unsigned int count_copy = 0;
( k8 d/ Z% T9 g3 O ?+ K
7 Q# w! t. }5 v; n0 P6 D/ lint main()2 j7 T) Z: c) Y/ q* n. N
{
$ N* x' @- C+ J( ~- Y# m, z9 ~ f5 x int fd;
( b. z( N- Y. f4 s5 `4 @" x3 u* y int *mem = NULL;
3 b8 |( @9 x& D6 C5 L" U7 z" [8 ?. L0 a9 u) K3 L
if((fd = open("/dev/mem", O_RDWR)) <0)2 y9 g$ q. \0 l+ a7 K9 M+ b5 X
{( `* C9 V* M$ T; r- Q! N& l
perror("open error");
- e4 [% E& X' l. w return -1;8 v1 E7 d. G/ X9 o) V
}
9 m( m' ^6 W' P4 N: C6 x9 a 2 U7 D2 U6 [) G5 X
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. S$ S$ `* b' M; {5 _1 C ?4 I2 Y) _$ u% S, X$ W( r/ O( y
while(1)0 W6 M3 J/ ]6 q) r7 K& i
{( _4 {, t" r+ H; q, |4 E1 D
read_MSG_buffer(mem);
" n5 w# R% A4 X% @/ |( a }
. i. f: j1 R- {+ d8 g9 z1 V9 A" W}) H6 ~! {) m1 g# Q# I# {: Q
1 O' x4 ?, ?( j! |( m+ M: y/ e# vvoid read_MSG_buffer(int *baseaddr)4 Q& ^# A- v- g/ m7 e
{! k) u" Q1 n5 Y$ w
pRX_MSG_PROTOCOL pshreRAM = NULL;
! I3 H$ k# ~. c+ @% C3 O* j+ t# E E( ~/ w# a, b
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ f1 Q: z4 p1 t# t* ~) d
' w5 i: I+ S+ S9 @
if(pshreRAM->packet_cout != count_copy)
( a! S4 u/ S. r# r& w) x {% m7 `; r. _0 Q+ k; ]' U
printf("a is %d\n", pshreRAM->a);) G( e2 m/ U* [7 q# p
printf("b is %d\n", pshreRAM->b);. r) o8 M0 Q3 l
printf("count is %d\n", pshreRAM->packet_cout);+ F% [6 z8 l. Y0 T) B
count_copy = pshreRAM->packet_cout;6 C k* V. Y P
}
: \1 v8 F# F2 L! f% Q' ^ else
7 c$ V/ k1 `- q. z; F8 Q# @ {7 p2 K$ ^5 e& B' Y4 E
printf("No effective message!\n");
. x+ E2 G/ a/ X6 {! P: H% ^ }: [1 M' M; E) }5 `/ [2 G
}
6 }4 z& E) `. W; `2 C/ T
2 S3 i8 \1 Z8 q+ y; j没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 u1 b9 {8 } Q$ t3 Z/ f) Q
7 Z' o9 ]1 J5 h! n6 T2 ^0 p! h9 k! _4 J# I3 ^ n
5 e7 w% j% J) e+ s, N& s
1 B! G, B6 W0 t, a0 e: b: \! I |
|