|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # |8 @, h9 I( X+ i
# f3 E1 X+ m2 M0 }. Y( ]: G6 k uOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' d9 F2 i* l& j* A) C* E8 E#include <unistd.h>
7 n, C- \% I$ {" H* C% v#include <sys/mman.h>
/ u8 a8 e+ k- k& d#include <sys/types.h>0 }. f5 l! x* ]* H
#include <fcntl.h>
9 U1 ?% _# g1 L! b8 t2 Y" u8 M% x6 i l' G1 F" K
#define SHAER_RAM_BASE_ADDR (0x80000000)
' u% L+ M3 w) w2 a8 j1 S4 L3 E3 v" [2 ?" {8 F* [9 q; s* `6 P
typedef struct
* n @8 G1 q" n, d{
; `7 H% Y( g; Y! I7 `- g/ D z unsigned int a;
3 E/ Y7 c6 c" D* A unsigned int b;
$ e0 E& X7 V% m6 |6 G/ K! K! z& T unsigned int packet_cout;
4 @# F) Y: ~* ~, m" k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! j3 W+ l/ \7 d5 }
^' e8 f0 }; w1 f1 E) G, ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 T; b% {; e& q: X+ ]- X+ z
unsigned int count_copy = 0;
2 [% F: a$ U5 @$ y) g4 d7 [9 H9 `$ V' P: \& f7 S, k9 w: ~
# \! }: {( l- K9 W8 e0 _0 X; gint main()
) ]- Y2 N! D+ I7 o7 L* _! U{
% ^8 ~- D5 D) B: l; v pRX_MSG_PROTOCOL pshreRAM = NULL;) {2 V) h! n% z$ T0 D; y
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! H. n% J, x) c
6 l7 C. ]/ Y: X6 @; [
while(1)% X3 [0 }" `. T1 U m
{9 ~9 o' t9 a J7 N. O2 I a5 ?
read_MSG_buffer(pshreRAM);" A% d' y0 B$ v% \: h
} , B" K* i f8 ]% n5 b% L. _
}( Z9 L+ R) {0 R
9 V1 N5 G; f: c* l3 w2 q c+ d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 t* z9 |* K" S" h: `' q
{
5 g$ o& C: c# s" t" ?" G RX_MSG_PROTOCOL buf;; E c7 P2 C; y `; u& ]) X
8 D7 t8 V" `4 _ L, z buf.a = pshreRAM->a;! k" X. V: F9 _ m2 f0 ?! q
buf.b = pshreRAM->b; p; { [& k) q+ h8 e8 V/ u8 Q' W
buf.packet_cout = pshreRAM->packet_cout;) @7 Z% [9 i. X4 `5 U: s# y
1 s$ @6 d; b" [ a' p; o' ], c if(buf.packet_cout != count_copy)! K4 G& Z1 B7 | q2 C5 d4 Q
{8 ^- n% U$ Z- c8 A% a
printf("a is %d\n", buf.a);
# N$ G! A* }' O! n6 S0 R printf("b is %d\n", buf.b);" t1 v& r9 Q8 B$ W. D3 f, ? a; Z
printf("count is %d\n", buf.packet_cout);2 k4 ^# t' F) t
count_copy = buf.packet_cout;& l W$ T* W0 B0 U$ Z+ o) p" j
}- Q3 l+ M; Q& o! K; U
else
2 H: a/ \$ s- o {
0 y+ w: p* U1 N0 l2 B9 R printf("No effective message!");
2 ^" m x0 J# T- @! G }
4 g X( z6 j# `/ v}
* t+ I$ T" u; q' }
, B5 P0 F2 ~2 X. v
. F- D* ^# N% J但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) s# ]+ ]7 \$ c8 y* [ `9 u
使用下面代码,对内存使用了mmap函数后:/ [- Z& Z4 |& W3 V- T- d
#include <stdio.h>
: B- {$ I& k& Q9 m#include <unistd.h>
- J/ t! r- v, P+ ~) g) S4 l6 y#include <sys/mman.h>2 L: F6 A. C c# X: z
#include <sys/types.h>
# G" `) J6 {3 R8 b6 _ G: R#include <fcntl.h>
+ T7 j( S+ Z5 K: M& L- E, N4 @3 I0 Y" Y/ ?: k# @: F% B! N
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 @$ w6 p0 a. ]) l' [#define SHAER_RAM_SIZE (0x20000) , b, ], a# X6 ]
( M& h. C5 M; f' V, N7 s. |
typedef struct
% o* @- {! Z( _{
9 a. I% c1 A( a D u unsigned int a;/ J- g$ s* |6 n7 s- u8 p" k% F. ]
unsigned int b;
: r" c. {+ H S S Q unsigned int packet_cout;
K' ]% P9 `) ?/ R4 a! g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 }. A8 g9 {" w: G- C T/ c) e7 S
. Z U& o0 Y" B9 S: i! I7 I. ]void read_MSG_buffer(int *baseaddr);5 Z4 |- J' ?0 @
unsigned int count_copy = 0;
0 u, [3 X- D/ a+ E L0 L+ t& Q6 m4 s! a/ V
int main()- v4 b! { L( y8 S! I
{
1 }# Z' m) D W' n6 d int fd;3 [# z( {* G, R- Z) J
int *mem = NULL;
7 j. z) ?: H, i5 \' g, W' D- Y* {/ }2 t6 H2 t1 K& b8 l
if((fd = open("/dev/mem", O_RDWR)) <0)
4 c' V/ q, U# q3 ~& G1 t {
1 _5 p# b7 y( t- U0 F perror("open error");
* ~. C; g( B; [- ^ return -1;7 @0 _) N8 k8 P5 H. N( C1 y* P l
}& m, d) S$ _! o! }5 @5 w
9 T# y3 S8 b, f5 c/ F* }2 S5 b mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 G: t U: ~+ g: v! W
2 E( H: r3 o3 L, ~5 g' _9 z while(1): K% c" v" B) t, f( Y- V
{
+ O0 q" D( a# _, o read_MSG_buffer(mem);
# G+ ?) M. e- o! A2 ^% Y& T4 N }
# A* @4 g9 n' P* d: u/ w4 x}
n# s: V* [' Z; m' ?% x; [
5 e% M! I: ?; \, Bvoid read_MSG_buffer(int *baseaddr)
2 m. {9 q! N5 W5 o( z# T( y/ h{
1 A5 d3 Q4 t/ _2 Q/ m6 I pRX_MSG_PROTOCOL pshreRAM = NULL;- o9 s- H% R0 p7 W# u
( j0 V1 I N5 i- z$ V, e
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 b% p! B& y3 w7 @1 F! @' d* e
" w# M' J1 w( ? if(pshreRAM->packet_cout != count_copy)- [6 H/ Y3 o j9 a6 v9 t
{
2 O9 ~" Z. m* H9 M printf("a is %d\n", pshreRAM->a);
& R t3 E6 c- \/ C printf("b is %d\n", pshreRAM->b);# m I+ c' q, _+ h
printf("count is %d\n", pshreRAM->packet_cout);+ j4 L; Z- _9 J. Y- l
count_copy = pshreRAM->packet_cout;1 w. [- T( D* z3 V# f* J. z$ }2 O
}
; u6 _% \5 B7 [7 } e) K( o7 X else
# r4 Z$ e$ {( Z' o* f9 p; _2 s+ x: P {
7 O2 M0 t3 M, l# I' m3 G: A- E l printf("No effective message!\n");
# t3 [9 B! M9 U4 p8 _ }
" ~1 Q. D2 D d8 r5 b}
9 [* \& b% p3 k C. ~ }' j8 j: a F* ^: b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 i8 U2 E( |+ E( n1 q. U
' Y& ?2 I7 @+ Q* U2 c/ O
c* m, S) k! u9 g/ v3 ] O
' H3 m( p' f! |' A
. v' W! w1 j# z, `7 S |
|