|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 U9 I6 n5 s: U
3 N& K$ X: n! U/ d+ U8 zOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& g6 u0 V2 e! t4 [#include <unistd.h>* C5 v0 u7 w; z7 C5 R
#include <sys/mman.h>
; N- s; b }, Z! C) f#include <sys/types.h>" q0 U* |& E; R( g+ \4 t
#include <fcntl.h>
$ G9 \6 w% B9 T
6 `, p, ^. b6 F7 H1 k2 N. O1 z#define SHAER_RAM_BASE_ADDR (0x80000000)
8 D5 G$ L! C* P! r6 l5 n) Z+ O1 y
& M) ^# x1 z2 U6 W" T5 {typedef struct
4 o/ D+ ?6 w6 q{
$ u3 i$ y" `: b2 M6 { unsigned int a;: h0 l; A% p4 Y/ L5 z6 w
unsigned int b;, d7 f9 R1 {+ H. s( k: ~% N9 a
unsigned int packet_cout;
9 ^9 G8 F o4 F0 D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 B. J: U' A1 O4 x
( `6 s) `. C) l4 E: [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 A8 D, I D2 w$ wunsigned int count_copy = 0;, }( ^/ u7 P ?' e/ H
* E, m$ [5 D; Y
5 z! U) P: Y! |) ?$ O. |! N mint main()7 ?1 q% Z6 d; j
{
# p; |7 A' H: y% w6 t& r o pRX_MSG_PROTOCOL pshreRAM = NULL;
# {& f6 [/ q% n/ j, ~( q- a* A' U) t pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ p- G" ]' q" ?* Z) G% z
9 P- c$ L1 T( Y3 k
while(1)
. l& M0 s8 C- \% ]: [& ~6 O- K0 A$ I {
# J! t8 M7 P: _* T& J read_MSG_buffer(pshreRAM);
$ h$ H, K; i8 ^. G } . E, u' i: V) Z9 b
}
3 C. T* U8 W5 K5 T9 a. R$ \7 l& Q, l
) J' S" v- t0 [7 evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 N" a1 i; M q% O8 ~0 [
{" E k, Q$ e! @) o. ]9 `& u
RX_MSG_PROTOCOL buf;" @/ I" M1 |. v' _" {& e( z" |( q
/ ]. W3 Q W; j* G5 C' f6 h: O
buf.a = pshreRAM->a;
1 |; z6 W; t) M9 H2 u: N3 ` buf.b = pshreRAM->b;
# o- y( t3 u4 l" ` buf.packet_cout = pshreRAM->packet_cout;+ s% d; Z( @, O
+ j) R% Q4 |0 S
if(buf.packet_cout != count_copy)' a+ R; X0 B- t' A6 Y( q9 g+ ~
{6 \' q, p$ e: _0 o' q
printf("a is %d\n", buf.a);
6 y9 w( k9 J2 ]( `% h printf("b is %d\n", buf.b);
& i3 ?3 L. [- d& N; u9 @, } g# ~ printf("count is %d\n", buf.packet_cout);
5 A+ V' u1 H/ J; T- @1 |% \; I count_copy = buf.packet_cout;. ]) Z" O; d$ D) `7 H# I
}
4 o) l, q- \4 B# g' t! y! c, ^ else
) A: c4 P* ^# m {/ b9 I7 g( t- z$ Z6 t4 D
printf("No effective message!");8 \# Y* `4 t8 `% p$ z d8 F# x
}
; d& i; |; W X/ Z* R# R}
( M# ^) a8 y0 s, Z2 A
4 f. C" ~0 a7 K4 `' `' j8 @9 y: B7 S! O2 n5 L8 {5 o8 w; x
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- }* Z" Q: W* R使用下面代码,对内存使用了mmap函数后:4 s' k" |- ]$ a( X
#include <stdio.h>4 q* y. @0 ` `6 J k( `
#include <unistd.h>
4 N: h5 D# q, m$ [6 [5 \3 v#include <sys/mman.h>1 m1 M2 s: I! g" R- ?* q8 O
#include <sys/types.h>6 l! R2 X* E0 @! }& U
#include <fcntl.h>* g) c0 H/ M: P2 }. z2 p* h: V
$ F2 p# j+ h( i9 E% q#define SHAER_RAM_BASE_ADDR (0x80000000): d+ o) F8 y* U+ {7 h
#define SHAER_RAM_SIZE (0x20000)
% D5 w( e" p+ I2 R
' F p+ S: O9 Y/ Ltypedef struct/ G4 _. X b- \9 A
{
6 e8 x7 O* {' f d6 M unsigned int a;8 a4 ?8 U0 Q( w" |+ i3 `: g0 x( X+ ^
unsigned int b;
/ y" q8 V8 @: M6 S4 ^ unsigned int packet_cout;, w3 l' |3 n/ |: D+ N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 b+ B# j# a; z$ r1 w U5 z
/ L" X/ w- S6 H% ^: c" V- nvoid read_MSG_buffer(int *baseaddr);0 v4 E9 K) F" {( _* O) H8 i) V
unsigned int count_copy = 0;2 I u& _! C3 ]9 w* {; Z
2 t' c x: n7 v) T8 o0 [1 l
int main(); S, V0 \4 Y# F1 T0 w5 c, Q( G
{
! I9 w* B) ]: B int fd;' D+ j: {* \6 Z" @) q. D/ {
int *mem = NULL;
% d5 U! _5 A' ^2 j2 r
% f5 x: T7 G; }7 T; p) ]9 q if((fd = open("/dev/mem", O_RDWR)) <0)
. y! Z+ `; n# d2 y {( y* r, g3 M2 y
perror("open error");1 [" s1 G& b. x! a% a5 R- c
return -1;1 A6 b1 N+ R: N0 B. ~
}
2 U1 ~; o4 L$ d2 O5 H7 u5 b) m1 i& @
# s& C4 q! ^- |& E6 e mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# S o6 e I) c% Y( B5 N7 o) K$ A
7 J+ y* q- p0 b$ D' h while(1)8 W0 `) @3 I. \* f& F: j" z- [2 I
{0 ^, g; g# I3 N& _2 G5 O" }6 w7 k
read_MSG_buffer(mem);: z0 L7 F, v5 B) h! g4 Y+ E
} 9 t* M* t, e' H- K4 j6 D
}
% L" Y9 z$ g" p1 q) j! V* T7 {; X" q" l8 a+ H4 `
void read_MSG_buffer(int *baseaddr)
, u" @3 w! X. Q) I h{
! \8 H( {3 C. D" b pRX_MSG_PROTOCOL pshreRAM = NULL;$ d$ x1 K) Y6 ^3 ?
' l' l( J: Q1 M) e3 G7 o" w pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 y) F3 @- t! E, |2 `/ O; q
# G5 h& T- w' S( ~% K if(pshreRAM->packet_cout != count_copy)
+ h. K& B; X4 j, R3 R+ b {- g0 U9 u5 }: J( D
printf("a is %d\n", pshreRAM->a);
" x6 ^8 }( w: \/ F: G printf("b is %d\n", pshreRAM->b);
- b% c# u- Z6 l- a% Z( ~6 T% _. R printf("count is %d\n", pshreRAM->packet_cout);
0 f( k' a# X9 J9 i- v" | count_copy = pshreRAM->packet_cout;
. T7 Q' S- M9 |% ?+ @ }4 _: z; t( u% i, |
else
, Q1 ^ Q+ K( @3 R# } {# E F4 p7 [0 { P" E* |1 S
printf("No effective message!\n");% K" p8 k3 R! `
}
* t+ t: P9 ]1 r* @+ }$ ^' c& ~: j}
% x, T+ A1 f5 n' _/ X$ y3 j* R( i4 A( h+ {8 D! I$ W/ U( @% I
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 _$ `0 D7 d9 C5 H6 H: l
. d* I! c# |# k I) H
: r1 W$ k3 Y2 ]( e+ @/ E% D
' P; B; x$ N$ r/ x6 ]% L$ k; f
# P; P, r# @+ O' T) A8 n, t
|
|