|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; B5 n, k/ I. {7 C4 M) e. P9 T q0 z* @6 U
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* ~% N) i# ~8 A7 f#include <unistd.h>
# _8 g, X @4 T$ Q2 K% U- k#include <sys/mman.h>. N- V$ Y6 E0 a, m" z4 J% T8 d# }
#include <sys/types.h># i, Y7 L/ V9 f5 u- b" @
#include <fcntl.h>
/ c; Z( }# J9 j- z: V4 R5 a3 j* s: E' H- m3 g+ E% h5 o2 M1 y U
#define SHAER_RAM_BASE_ADDR (0x80000000) 2 l0 ^8 g9 j0 l0 i" H8 X
" N+ W/ w( h! x( [
typedef struct. F( `6 G9 a7 s# V! s' i/ \
{- d/ r5 U5 u5 N: E) V1 d
unsigned int a;0 B. }8 M) r" b. ?
unsigned int b;
6 r. V0 g/ j9 y' F; }3 o unsigned int packet_cout;
/ U; k1 @1 j2 ] s# g( P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! T+ I% F3 |1 e1 Z; v' R" N
& t( U" `- l$ ?9 Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# v2 w4 A) s, ]: O5 T8 h7 |7 Munsigned int count_copy = 0;5 _; m2 E1 a0 Z' P" o$ }% P
a5 {, g: b M$ Y- u8 g
9 n- n& C; v; H; ?* n/ \9 Fint main()
+ _ T7 A' ~; N9 z, u{
0 \4 V. T X0 i( L pRX_MSG_PROTOCOL pshreRAM = NULL;" d8 Z& [9 D, I) F3 b0 w
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 D+ Y) I) U, [8 o
! o1 G7 b i2 Q$ g while(1)* J. J7 }- X/ r! S" D
{
$ Y% J) s% Q! {# b1 z- [ read_MSG_buffer(pshreRAM);
# I( }* e$ U# R' `5 }: E4 ?0 }2 C } 0 F3 r4 q. @9 s! J- Q: X6 J- L N
}2 V* x4 B" h( ~
$ P. E) C! d0 W. x6 ]% D+ C0 Gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 @: S+ T6 P8 g3 F3 ^{
& W4 ~" T. ?" H. t- @, w RX_MSG_PROTOCOL buf;
5 l* V+ c$ `1 ?8 ~
; L, r5 {! k1 n9 l- G. a* g) [ buf.a = pshreRAM->a;6 j4 z# b, c+ D2 X$ ]
buf.b = pshreRAM->b;( k$ R5 `0 G/ u- P
buf.packet_cout = pshreRAM->packet_cout;( ]4 l& g9 {0 ~, @0 J
+ H0 h6 \# k, p+ K- W" B5 s2 y if(buf.packet_cout != count_copy)
; W4 V! A8 w1 J5 ?" ` {) V6 X5 t$ f; G/ i
printf("a is %d\n", buf.a);
8 f2 d* e, ~2 d/ P printf("b is %d\n", buf.b);
5 b; ^* Z& ]2 C+ e printf("count is %d\n", buf.packet_cout);
7 }- K- Z0 v1 L( f% m* j0 T$ Q6 B count_copy = buf.packet_cout;6 A+ E* V! L- E2 F. Q" i
}5 ?. `- ~/ E( x) Z& n
else6 ]1 L, b, T" G8 ~8 I
{
' _$ |( I# |$ z5 w2 H printf("No effective message!");
" t- a# x4 Z+ E }1 Z( X; k' j2 z. o4 |
}! t6 m5 _" k7 h
' x$ o, P! o. H; p' h1 D3 Y' |
& U! z1 p$ `& [, h但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. `4 E6 S0 u$ R5 Z4 i B使用下面代码,对内存使用了mmap函数后:
9 b E( _/ C" `4 J#include <stdio.h>
5 r) B1 ^2 e, X0 r, v' M4 G0 D#include <unistd.h># v) s& A! x7 N& w9 ^
#include <sys/mman.h>
: D9 @' \( h& ]( B$ b: c#include <sys/types.h>
E' R) b7 @, a3 a0 d#include <fcntl.h>* ~1 q P6 z7 |2 Y0 `8 s
; j# r* S* w. E0 C
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ t) X# K* B6 e% {& c2 F# \0 W5 R#define SHAER_RAM_SIZE (0x20000)
$ g/ V$ H; Y K, t# g- W5 T3 S% \# _+ I) ]; o3 U2 c3 K& o
typedef struct
, K, K" u( W2 y5 l5 a" T{
4 c! s9 G# N: Y: r( s1 B! V unsigned int a;" _) O: ]" o% C* s% _4 x( v
unsigned int b;
( J* p! x8 M2 v unsigned int packet_cout;
, s. }9 M/ k0 X" F& S- N}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 p5 N2 b1 i& `" a5 e% P
6 n# N& D2 S! N; Kvoid read_MSG_buffer(int *baseaddr);# {" F) a3 N! U% q) d+ [( [
unsigned int count_copy = 0;, A: W7 H% D* z$ S7 Q
x5 p* {+ E/ u: M+ s" W
int main() e7 r7 M$ }- J4 G% F
{
5 A, E8 q' ]* f% m9 d/ ~7 Q int fd;
7 I6 o. Q Z1 v int *mem = NULL;
* B& W; ~6 c( r: k
s) F5 n! M1 L/ \" g if((fd = open("/dev/mem", O_RDWR)) <0)6 w" a8 ^( u' J8 o
{
1 A' M4 a1 p1 S' z! s3 ` perror("open error");
7 t W4 X) L2 I+ r1 m return -1;
3 ^& f8 f+ I0 a% C& }( ~; H; D) T }/ v6 S) O% r% w% R* ^
1 I W+ g- ?- d' i. r+ V0 f mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); p+ a6 B# Y5 W! Z/ A* D9 z
\) Z1 W( x5 L- L while(1)
4 \2 O+ _; C0 }$ L {
& x4 l3 e M* g+ _ read_MSG_buffer(mem);) v8 e! y) p8 i7 @
}
9 O8 Z8 U! U. x# i3 q}
3 S1 \, m+ z4 a7 q6 T/ p% ?
2 @6 b0 g, P3 ^" F* g6 ?8 L+ kvoid read_MSG_buffer(int *baseaddr)
3 O& o( B3 m4 R8 \, m{ ~! K5 h; P# P" t: x
pRX_MSG_PROTOCOL pshreRAM = NULL;
- }9 b2 \, ~" |. ^: r! \& Z2 J2 v9 @2 @* C7 ~& q, }9 j. g: {
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 |# I" ~& K" h- P' X
& C8 _, Y8 a: x& S0 h6 { if(pshreRAM->packet_cout != count_copy)
V" e/ \3 Y/ S8 F n1 l8 o1 H {
2 Y( v' _2 E, S5 Q9 G6 v" k. | printf("a is %d\n", pshreRAM->a);
0 n( r5 \, }; p, p! L2 y printf("b is %d\n", pshreRAM->b);" q2 R& f/ L: e) ?- T! f- E# b9 n
printf("count is %d\n", pshreRAM->packet_cout); J6 S% J7 v; l$ g. r
count_copy = pshreRAM->packet_cout;# C' \/ [; k: I% C0 q9 L
}! \2 B5 K! u: C/ n M- F2 Q
else
! J* i3 `4 L0 | {( O+ p$ R0 W8 @. E2 {3 z
printf("No effective message!\n");
6 `: \( v# U4 U' [ }3 N- l. g1 O$ v8 a8 f
}5 ^, @8 f2 ]5 z7 L7 V+ `# y
t3 |# ~ ?# H# Y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 ^ K% a+ Z2 n% l. S4 m
! G- }' N. G* }) W+ e3 n" s$ d
( p; {; T% k, t; o8 K
( s+ b- C5 X$ i! i! y+ p6 M7 y% Z# `) Q" E/ L! ]- V* n7 R B- b& s
|
|