|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! Q/ S+ C/ d) A0 q) x! |1 Q% S3 O9 X {/ A1 u* O0 e
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 ~' q: V' r @
#include <unistd.h>( l {$ W$ U+ L' k# ?. R0 R# o
#include <sys/mman.h>$ m% A) n, ~0 [& H/ }
#include <sys/types.h>
) }( S* I% Y$ m% e5 \% h: n#include <fcntl.h>/ j. i5 |. N; O3 u- g
* f( X$ L/ U# C3 T#define SHAER_RAM_BASE_ADDR (0x80000000)
4 L: F" o( V1 t& ^4 n: D, l, n7 L
) }7 Z/ B8 o4 v/ l+ Itypedef struct% [; B) L3 Z) M1 ^2 S: C: Q3 D
{
* n: \& L0 D# N @ unsigned int a;
4 S9 W& Z. z$ A/ N unsigned int b;/ n, n t3 } G$ B
unsigned int packet_cout;
# @+ L) K! o0 |0 Y5 `}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( I2 U, Y, c$ Q3 q8 }
$ D, Q! H- Q8 |+ R/ J4 Q) hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' j# m% G0 E* F: @! B* Kunsigned int count_copy = 0;0 A; R u$ Q* p8 b
$ y! `8 ?' v, N9 j9 O9 E
# L/ L. S# `% D3 l- A& k& Z
int main(), v o1 m( B @; K
{6 J4 {" x4 B* l# ], u' w
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ `% S2 A1 I% K' C/ D' c pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 T1 Z. I1 b1 L& d% k9 Q, U7 c, e) R' [9 H; h& i3 ^' D- b" N
while(1)
- q9 P) [3 @) n+ I: T7 H {
* p( ^, R3 B5 z/ k read_MSG_buffer(pshreRAM);, q! I$ h) y6 \
} 8 g- }* i9 C4 d j$ r* I
}/ G( Q( d; ~! [5 A* p4 y
M( D& Y& x& ~! D% W+ @; v0 q u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 ]$ E' H* h+ W9 j9 T$ G
{
, B1 c. }) g8 K* [' v RX_MSG_PROTOCOL buf;
1 p" h5 Z/ W" I8 o; H 8 j1 E! Z( C0 f' w; O6 q$ | u
buf.a = pshreRAM->a;
# D- l. f i2 n# g' O. O7 u, K buf.b = pshreRAM->b;; T4 S2 w, \1 m0 i
buf.packet_cout = pshreRAM->packet_cout; v& N1 S+ G; T9 m' P
x5 V* j! X& r% K
if(buf.packet_cout != count_copy)
' E' Z+ P5 U. z# P {2 g& |% Z7 V# M
printf("a is %d\n", buf.a);
; l0 \5 j$ X& I y) f. p) j printf("b is %d\n", buf.b);
3 s) `( ~0 F7 w0 L1 c/ P printf("count is %d\n", buf.packet_cout);
! V& Z8 D2 f& I9 n$ a3 O count_copy = buf.packet_cout;: G! R9 R t+ r! m, E
}
% u# ]7 V! K/ V else
, K& U8 r, ~: x, d, s. z) H: x {* ]& c6 W/ C0 i4 j' G0 R" C& `
printf("No effective message!");
8 {' c( [ K# m! J3 @' k1 R }
, F5 W# q' ]( v& k}# _. {& J( c5 |0 `" ?) I5 l1 ?
' O( i; Y# V5 n1 o: U
+ w4 p$ V2 k$ O- R) A但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 [4 O0 |" X7 k2 G( g使用下面代码,对内存使用了mmap函数后: v, K0 [) Q7 G3 p7 V# G1 f+ F0 C
#include <stdio.h>% k# l, a" P; w/ F# T7 h
#include <unistd.h>
w# m, g2 M5 o#include <sys/mman.h>6 s$ ^5 A1 w" x
#include <sys/types.h>
# u! S# p7 l- S- a#include <fcntl.h>/ A, c8 Z$ I" N9 J- G
7 z8 W! H7 s6 |2 {
#define SHAER_RAM_BASE_ADDR (0x80000000). u. V: F5 h6 K* F
#define SHAER_RAM_SIZE (0x20000)
6 y8 @7 h# R V7 g( H! y V7 s$ N9 f. t5 P: z) ~
typedef struct
% I& E# R. B. F! |2 _{
( z6 }. {& G# @6 T" ?% q# n: | unsigned int a;: ]7 }; ^& P n
unsigned int b;
' T4 C( w3 n$ X1 Y! i4 f unsigned int packet_cout;
; O' C: ]' |8 z( ?) Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 Q3 ?9 n: U* n! Z) h/ t4 y* ?
" }% M/ C* S" N5 z8 s" s, T
void read_MSG_buffer(int *baseaddr);
4 @6 r: @5 R5 A& w+ j4 {7 Z+ Uunsigned int count_copy = 0;
- S* f) U) W- B+ ^* I6 g& f5 @4 F3 c2 s- n& i9 ]
int main()7 w5 [# L, l* |9 V
{& n' V2 L1 R$ s: W H8 q" l" x9 _) D
int fd;
& a2 \" y) [% Z! b7 a: I int *mem = NULL;
1 D4 G; E. M: M; t$ Q$ v W8 }+ Y8 Q/ e
if((fd = open("/dev/mem", O_RDWR)) <0)
! V4 g, ?7 M( E% Y8 @, Y, O4 ?( k {% Z, ~; l( C. R. ]3 E4 s
perror("open error");
5 i& Z; D# b I+ [ return -1;
1 S. E; A9 }! Z( S9 R }
5 d+ @) d- d8 g' G) ] : g6 V0 U! g8 F, `( K0 c
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( G; h, W* m+ e1 l+ L5 l: q2 V \
while(1)4 K5 S/ f! o8 {! m8 b
{0 s: |7 X9 ?4 ^' A. t
read_MSG_buffer(mem);/ R1 n2 ]. ?7 L
} 8 t9 R7 ~& p9 t7 Y l- {
}+ O" w: e' y& {) H/ i
7 B6 ~: L+ l* W" A7 i% Qvoid read_MSG_buffer(int *baseaddr) g; D4 M2 ?8 |; z
{
1 Z0 X- Q8 {. H* |% C, z pRX_MSG_PROTOCOL pshreRAM = NULL;
/ C+ \+ t+ l0 {, p% K0 L! H' B: ~
! N" f1 ^5 z" a; S* y' F S8 h pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;8 o% T5 H& I% D& c) c( Q" p
- w& n5 t7 K) q
if(pshreRAM->packet_cout != count_copy)
, n/ n. Z( g: P) k/ D {
, |/ y, N( z0 l/ _9 w$ d0 Q+ | printf("a is %d\n", pshreRAM->a);
" H# M) n6 ~1 o# l5 o- f printf("b is %d\n", pshreRAM->b);* p4 {: F4 V5 Y6 D2 l0 j
printf("count is %d\n", pshreRAM->packet_cout);1 M' n- A' P# W7 z8 t" ]
count_copy = pshreRAM->packet_cout;
% N! c9 d9 [+ z' h. m }; p3 |5 T1 m( o0 v8 ~* R- R
else
& k4 h/ m. [8 j% i4 k6 \7 s1 d {
' J$ n9 n0 `) Z) G: A. C. f7 C printf("No effective message!\n");: D. |7 a: \' S% O( \1 s
}7 M$ ^4 F1 x# Y
}6 g: e. ?6 |; }
" f$ j0 u7 Y }# Z N4 S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% e) ~5 e) @1 j$ t3 H% h w
& ^4 S, X: x/ v- W8 c: e' L- M) H) s4 P2 V; K" X" N$ g
& @2 B! m+ A0 Y+ F) {+ U& |' S
% K$ G3 r3 B9 K" _ |
|