|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + V; D% Q& f, J+ o
- A" D! |; x7 @4 oOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; R7 e* `7 _4 b$ ] v
#include <unistd.h>
( o: l" u& u/ V( M#include <sys/mman.h>
! ^: Q. ^8 {0 `7 a/ s6 h6 a#include <sys/types.h>9 I, }+ U9 A& v- X R4 t) n# ^, \5 O
#include <fcntl.h>* _" y8 _+ `* l6 _4 G. M
" m* D0 [6 S6 V9 R+ ]1 ]6 ]( C
#define SHAER_RAM_BASE_ADDR (0x80000000)
' a7 i) X, |# ^ r; |: P- A) y7 X3 t2 ?
typedef struct4 Y, [4 ^ V/ q4 C& T8 r
{2 T) H1 b! z% r- r/ n- Y/ D( [
unsigned int a;5 L( R' ^+ P& ?/ p$ a, ]( A; x
unsigned int b;
" r! T* M/ J0 f unsigned int packet_cout;
3 e9 u2 |+ `6 m$ `, N}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, D" g+ w* i: p
0 r+ ~; m0 {. I6 P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- d) W$ @& @* n: M* h0 c3 u0 @unsigned int count_copy = 0;. l. x- |/ t6 m# M
& W4 u; X* |1 y/ P7 Y
. L) [4 }6 o4 |* J% lint main()
' I$ |" g! z0 {# ~$ f3 \4 B{) f/ R Z Z$ G+ W# D% i( d
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 |8 A4 {5 v2 C+ [ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 ?) E- n! G& C3 X
" V" l2 {4 X/ r' h/ M4 w while(1)
2 U R3 V- y7 l) r {
% p* H4 i9 w! J$ g read_MSG_buffer(pshreRAM);
$ m% E/ _9 e! r4 { a8 W } : W( V0 I% G, r8 U3 d r/ L0 P3 F
}3 x5 i3 s" n3 k- `. Z9 {* R
8 F/ M* G0 F- H6 \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)2 i9 \) x* o k+ `
{
! |0 K' H( v- V8 [5 r0 Q$ v5 L RX_MSG_PROTOCOL buf;1 p! ~) ^# F ^3 y
- n2 j8 S% S( J' p$ ~( @
buf.a = pshreRAM->a;
8 O5 `! V( y/ K% ` R. y3 Y. K buf.b = pshreRAM->b;
8 m" F! {/ a4 _! e: j buf.packet_cout = pshreRAM->packet_cout;
# g" b/ B8 `9 o; j 1 L4 N. s: j5 {3 T p5 w, L1 k
if(buf.packet_cout != count_copy)
7 p1 @* `: w. d7 R% S- [ {
( J& h4 c6 |5 I& S printf("a is %d\n", buf.a);8 q8 j! x o0 N
printf("b is %d\n", buf.b);
& L9 C1 t2 Y$ X y4 y1 V2 N5 n printf("count is %d\n", buf.packet_cout);
1 G7 \! a. k+ W" n count_copy = buf.packet_cout;
& y0 J6 T7 E/ r5 q- E& M* E, t }
Q& L' R5 Y) ^& [3 t: q else7 y6 n5 }7 y, i; ^+ @
{
' e8 Q6 p P3 @' B printf("No effective message!");
. M+ { q# Y8 S1 H2 @: R }* ?) `" p* y; @8 c& Z
}3 S0 b, ^! o$ J
5 W5 f8 o. M- T, A' o# z6 T3 H" o/ t5 B: @4 D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 g5 }0 c; Q7 e7 S8 P3 U
使用下面代码,对内存使用了mmap函数后:' l# h/ T7 _$ t. [ O, L4 D4 P/ ^
#include <stdio.h>
8 P: W; u# D3 o" @/ c% ^) {8 h#include <unistd.h>
) D4 v/ t+ j- T#include <sys/mman.h>
3 m1 T5 S4 q1 u$ D2 L8 i: D4 k#include <sys/types.h>
5 G Q+ N1 h! s( z# d" b#include <fcntl.h># @5 g) d4 m. [' L/ Q+ j
& [5 A4 w5 v; @: x J#define SHAER_RAM_BASE_ADDR (0x80000000)
$ o$ L$ f e* Z# Q$ m6 _: q#define SHAER_RAM_SIZE (0x20000) 8 Z% s' ~& r j/ Z0 s1 f
7 Y' c7 f- E- ]1 E' L5 Ktypedef struct
3 A# X; r$ ~ }0 e/ T3 o+ ^{
) ?: O5 U4 v( l unsigned int a;
6 D ~: h: q; m) S unsigned int b;
1 N: Q" I0 f- H( [9 u7 R' ~ unsigned int packet_cout;
( X5 G1 S7 F% c. U. @1 z: Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: e/ O! f) Q, y
+ g+ a' h- k) ~" f5 R/ Cvoid read_MSG_buffer(int *baseaddr);
7 c }- J$ Y, N1 v2 M1 A. F8 [unsigned int count_copy = 0;
, N3 Y* ^) F) J8 x; D, ]0 ]
* Z& ^& d) l( ~6 J7 Tint main()
2 r3 T- c9 s/ d! \{- x" Q7 ]/ G. K* p' K
int fd;+ r9 h" \& Y( N. R( c
int *mem = NULL;. D' X3 _1 |9 @) K/ I
0 m3 a0 g% E/ L5 a" m
if((fd = open("/dev/mem", O_RDWR)) <0), |+ z2 u5 p8 B; H! |: V k
{
9 u3 _9 }# A# h5 I perror("open error");8 n6 o/ Q/ t: V5 a7 O* s, r. @4 M
return -1;: H9 Z5 Q1 v5 B) D
}
& t/ G* B; `7 M N7 F3 }1 e
5 }/ I6 B/ F: O# ]2 J mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 H' ^% k3 a$ h1 v! J! G8 H3 E' a
; k, ? @, i q9 V. O
while(1)4 w/ T( g2 q) y$ R' b
{
Z: |5 j8 ^' b Z4 b0 w! { read_MSG_buffer(mem);: X$ F" u ~6 o- m6 ]. @8 c% P9 E
}
/ ~6 P5 V8 N! _3 i}3 ^0 E* ` i v) U. l+ p2 S
6 \* z+ O% Z8 T/ X5 jvoid read_MSG_buffer(int *baseaddr)/ {% r$ t" r) N1 H; ]! F* H
{
% V* r) M U3 O5 r1 v pRX_MSG_PROTOCOL pshreRAM = NULL;
3 |) ?$ D: P! L- Q' B( u6 \6 w6 F# m9 c' {( R9 ~8 U
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: w) u, U0 R5 Y, h6 k& Z* u. c4 u
# y5 u- m; p8 e( B: F if(pshreRAM->packet_cout != count_copy)
. @- g6 x( |# K& X {# _0 d* v4 g% D1 R( I- ^2 Q
printf("a is %d\n", pshreRAM->a); C9 |6 E. e( P" g( }% O
printf("b is %d\n", pshreRAM->b);+ L9 J+ N; l# w# t; S) V/ N* o
printf("count is %d\n", pshreRAM->packet_cout);
z% x+ O: O: {1 P* _ count_copy = pshreRAM->packet_cout;/ _4 ^- u( o; ^) o, x# {
}
' u5 g* i- }) g9 Y3 \* l else
$ l$ y4 U8 F! \+ y {2 r; t/ ~6 F1 O& ~; Y7 Y2 s5 G5 D
printf("No effective message!\n");
8 c J. \- A* O" c% V& U) { }
0 l% T' N$ u4 y}# j% }, ~8 y5 i' K& a- `& A
" L3 c2 d! a) t1 g没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. Y! }7 Z2 `1 p3 }" e( D8 z. I
3 h5 s$ W! Y+ L! |. Z
( w; L" p" W2 M$ [
4 P9 O( _; Q8 Q, ?9 V7 x2 R
' ?: Y" T+ v. Z% Y# S |
|