|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + w' L9 _$ \) |# ]& K
, P+ I) Q8 Y6 o, AOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* _ r! y# @2 V" N
#include <unistd.h>9 m% v, \4 f3 n" c' {8 f
#include <sys/mman.h>' o+ q6 q |# f& F/ L; n- i, T. i- O
#include <sys/types.h>7 {6 U4 X: t1 L
#include <fcntl.h>, r# z/ n9 V5 e4 B0 P
9 F5 ?/ _" k& Q. h V. e#define SHAER_RAM_BASE_ADDR (0x80000000) 3 p& Y0 b- t5 @/ Z; p) O" @
' |/ C- a D8 i5 `
typedef struct
" O+ s! N0 k2 \+ Q8 u{
* [, O+ @0 F+ | unsigned int a;" }/ g* g3 b2 p, s& |4 Y, U
unsigned int b;* a. o& b: c( g" J. b( j* C9 k
unsigned int packet_cout;
* K$ _4 ~0 P8 r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) B4 o. d" y9 t# v+ A) m
$ \8 {# U2 L6 J- l6 jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) k* R3 R, z, D2 Y+ p5 M6 U9 k
unsigned int count_copy = 0;8 @0 s% l+ t2 F4 p5 Y0 S) X
$ i4 a7 `1 f4 c4 I
2 P1 a( t# f# C; U6 K6 Lint main()
, ?1 L9 s9 z' O( ]4 B, ?{
" t" d5 g( T+ c: C! m8 ~ ~# D8 b# v pRX_MSG_PROTOCOL pshreRAM = NULL;3 k Y: M3 ^7 r" z0 F
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% m& D1 @/ F! G- Q& I1 N1 p- C( ^
a I/ {/ P# D1 w while(1)
- { I3 e* o2 f2 m% c* n* Y {
) t) G1 e/ Y: e: [2 S read_MSG_buffer(pshreRAM);+ u+ D* x0 D8 a0 x( |+ G
} # x' f- n; P- Y# M& g
}
# w* V+ w; Z; Q; [0 V3 [1 o3 z# q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# [- R. N3 _& s{: B" b4 C: u7 B3 v5 L5 S
RX_MSG_PROTOCOL buf;3 M! G6 b. e! T$ r' Y9 r# S1 A
) V. U$ V. d9 L
buf.a = pshreRAM->a;- q, [5 D# X$ w& a$ Z1 x6 ^7 W
buf.b = pshreRAM->b;. o& ], n% Z) m/ s" L0 X- x
buf.packet_cout = pshreRAM->packet_cout;
9 s0 T$ e! n: T Z! Y* _0 h
# }) v5 u7 M. z9 l' V8 g( l if(buf.packet_cout != count_copy)/ T8 Q+ D- h4 S- V7 w$ c) F
{
9 e; a `; ?. t0 n5 d: e: O printf("a is %d\n", buf.a);
1 D1 Q$ D+ ^! W printf("b is %d\n", buf.b);
! B; |# [7 V1 f. ?# }% w1 P E) G6 i* M printf("count is %d\n", buf.packet_cout);
) B; C j; B8 l! k5 q( r- w count_copy = buf.packet_cout;
, Z- @$ O6 O$ o9 p( A- c }
7 ]$ a& r8 e5 Y/ ]* h0 R else
" h2 ^/ O& U$ c- s2 B' s3 O0 p {
; Q0 W8 o* F: L; { printf("No effective message!");
E8 s! o1 n p" f4 _2 z }& y; k' M# ?& T! x1 ?/ c$ l
}( O, g% H) x, |0 l. ]- d' B
/ [+ P& C3 e3 N: }" y& E9 L7 Y
( a! n% j3 Y6 i# n; C4 y9 S4 w但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ B: h2 |4 L; U9 V( Z; K7 d9 X使用下面代码,对内存使用了mmap函数后:
7 D8 T, ^6 i% { w+ Y6 t#include <stdio.h>
8 I8 ~9 d7 n! I, T& L2 |4 B) T. C#include <unistd.h>
5 _6 o$ `7 Q5 N5 u#include <sys/mman.h>
# M* A; W: ~& o& ?#include <sys/types.h>
! f; S+ Y9 I: O2 M2 @; e1 c% ~* N; K#include <fcntl.h>
$ t' e+ x* E2 q1 w
2 _7 [. \- c7 ]& [" Q2 C: G$ N#define SHAER_RAM_BASE_ADDR (0x80000000)4 L1 B3 V3 K6 `. V. l( _
#define SHAER_RAM_SIZE (0x20000)
1 s2 }# K6 L; R
, R4 r: s8 h: V, ]3 Y; X9 i" Z) l% atypedef struct4 H2 s$ ~9 \: n. t4 e
{3 y% |. o8 x' f
unsigned int a;! ^/ p4 g' n1 ?* [2 P) ? c
unsigned int b;
$ w- m: ?+ t% E0 m, b- g& N+ A3 T$ h unsigned int packet_cout;! q" a* W2 v# G8 g/ J0 J7 p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ [! l6 R2 i5 G& o& O1 A. s/ H. f& Q6 P
void read_MSG_buffer(int *baseaddr);& ~3 k6 g' [! Z, \; G
unsigned int count_copy = 0;
- K2 u. F0 U3 c# B0 `4 t& o ]4 [& Q* P$ k
int main(). E) |8 ?% U; Q: s1 D
{
' @7 }& D- ~' b% A, Z int fd;
9 a- D' g/ x+ O# K4 S6 Y int *mem = NULL;- L' R, u9 _# b6 ]9 L( [; C
2 b' j. P7 Y/ I9 `- S if((fd = open("/dev/mem", O_RDWR)) <0)' B- J$ ]/ n5 p5 X' Q" [
{ h% Y7 z, [+ d/ a
perror("open error");
* ?0 M) D; l6 Z) _3 t6 B H return -1;: ~. D1 L/ Q1 g( C% o/ U
}
8 `4 x g& N. M" T$ |2 N% D " T t( \1 k" I |: r
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 y0 P& k5 j. ?( o7 m+ E7 m6 E. h s7 Z- D7 ]
while(1)3 j' A6 \: G' ]/ J. @& n
{! X9 c C3 M( Z7 g$ \! ?0 E% n
read_MSG_buffer(mem);
. ?! ~0 k! m1 U1 U& X0 ] } 8 C* e2 y+ [) V
}# d$ [0 [& s7 o- J- b+ {! G
/ _* H) I/ H3 E( s9 yvoid read_MSG_buffer(int *baseaddr)3 i$ y9 ~- r) C
{# A/ V4 V- C* O4 q4 S7 A: L
pRX_MSG_PROTOCOL pshreRAM = NULL;
" K* P+ u; @) g) o
( \3 l% c! U9 h& f pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& d' \, h# Y' ?0 W( S) z& K; S6 l
if(pshreRAM->packet_cout != count_copy)
* r3 T* O, L T1 Y. U+ l/ K {6 E g1 Q1 O/ k K
printf("a is %d\n", pshreRAM->a);
' T7 h: [) M, K8 ^' `2 P1 K printf("b is %d\n", pshreRAM->b);' m) f2 W# M9 b$ m
printf("count is %d\n", pshreRAM->packet_cout);
3 Q) Z& W9 T6 g' R$ E; L' x count_copy = pshreRAM->packet_cout;
/ }! ]* b# M6 T* Q2 X3 }4 z Z& Z }) c3 |: i* T# |) T3 O
else% f" `0 h" u3 ~5 R
{
& j+ V2 V4 [4 R. _) J printf("No effective message!\n");
! L5 b6 q$ Q; W }
: g# y- G; C+ U/ ]0 z9 x}! ~" p1 Z0 H% \3 q. q1 J- p
8 v q) Z2 o" A2 V B9 Q8 ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# j' X) U4 A/ u! i0 D! P0 t' B5 B$ B% t" n& w! X. [0 @
/ Z* e Z& K& ~! S' L9 z; {$ L7 v/ x( R7 R$ v0 H% b
; m- r1 h1 ]2 c+ m0 ]# i& C |
|