|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. l+ \! G& u' }4 u0 k! c0 H* j' Z1 ` P3 {8 O- q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 L# A# Z* X% _( N& p#include <unistd.h>
7 p) D' C/ J) \2 P$ o#include <sys/mman.h>0 r. k5 m5 j- H5 c
#include <sys/types.h>% M. S8 n+ e( ~$ ]- a
#include <fcntl.h>
( i& Z, `: L8 c3 g
x6 h) ?3 t1 u# r$ m8 `9 z* r#define SHAER_RAM_BASE_ADDR (0x80000000)
) W- `9 m8 v& G* j7 B! |1 H8 l$ {6 h
typedef struct: o% d+ S; D! p! R
{
! k. ~0 C J" x5 Q" ~. \- s, U! I2 ?% s- ~8 Q unsigned int a;
" ?- L7 O+ J# V3 Y3 o5 t( N unsigned int b;
1 x! W7 r9 D) |$ L unsigned int packet_cout;0 o2 [. U; E; U. B: M2 |2 P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 u& G, u4 n4 `; Z
$ x* w) K9 j* Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. ~4 h% M P/ I! E7 }- _/ }9 ?7 a( ?unsigned int count_copy = 0;' N# \0 x v8 d3 [
- v0 Q. A, \) y* b8 K1 \" ~
- A1 E8 L# C, Z# F/ y
int main()* R% j$ F. U1 ] y- t
{
- E+ N+ o! G( k( L2 W. ^, C# _- E pRX_MSG_PROTOCOL pshreRAM = NULL;1 @: |+ d* S g) n' E% V) v+ o# B' \
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ N4 D7 n" a4 V1 b" ]
' _$ J5 F- [3 b9 W% J6 H) t- L while(1)! \$ V t* Y* F$ N: A& U; ?! i
{+ _/ @& V7 Z# p0 J
read_MSG_buffer(pshreRAM);
1 C7 e9 s W+ `. {: s+ J! U$ o6 J }
1 s# F: k9 o9 q& }& h1 J}; @- r( U; o4 g& [7 q9 g' i
! Y4 g$ K' Q: z9 u, \9 n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) _3 I9 i/ a L5 W* _; w{
# v* M1 `- ^! j9 [ RX_MSG_PROTOCOL buf;
- ? x4 h; R7 A. m7 X
/ c9 A. J2 l6 g- u8 o buf.a = pshreRAM->a;
9 c# J0 p _2 ~+ [2 ^& B buf.b = pshreRAM->b;7 E! G5 k4 ]. n1 D
buf.packet_cout = pshreRAM->packet_cout;6 F: ?8 h, U7 g. M* \
, v; u4 O9 [7 Y$ y$ M
if(buf.packet_cout != count_copy)
( S* {6 h; t7 Q4 @6 @: R4 K {; q. |5 y2 y+ Y) }+ r
printf("a is %d\n", buf.a);& ^ W( }% Q! t, l2 g( e- x
printf("b is %d\n", buf.b);: f7 ?" T; V. N8 a* L% Y
printf("count is %d\n", buf.packet_cout);
4 p( q, C- V8 e# w6 k3 g2 { count_copy = buf.packet_cout;
/ k: D0 r6 E$ J: D }/ A. l2 t- Q3 O; C
else6 g0 P3 b2 G5 t, F: _5 n' g9 ?
{3 v e: E% y+ l' }$ e% ~7 B
printf("No effective message!");
2 A" D1 O3 E4 L# _ }
* Z, I1 V/ C# p! a5 M( k: ], m}. p- M" m2 ~: C/ W" n" t/ K8 |
0 j7 _6 x W- a: E0 [0 b$ N! Q
$ t7 j f1 C" M$ c% O但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ R$ z: \5 j1 y5 |* x$ c0 l1 j
使用下面代码,对内存使用了mmap函数后:
2 F5 x* h# k+ Q2 F! f#include <stdio.h>3 C* C% K8 ^0 U. _& d" `& K; J
#include <unistd.h>
" B9 ?1 W4 l- [#include <sys/mman.h>: T4 ~7 D/ {6 y4 W, F k# q; D% X
#include <sys/types.h>
/ u2 ~% V+ A% U! G" w, y% g! e#include <fcntl.h>
" U6 Z# K4 V& b3 g N# v" g# l3 [$ ?% O9 Y0 O
#define SHAER_RAM_BASE_ADDR (0x80000000)
% k r* P5 G( T/ K3 h/ k#define SHAER_RAM_SIZE (0x20000) : o( X5 K) D" c& w+ ~! O* d" U5 t
1 B' Q7 l/ v5 c5 B) t& b6 Ftypedef struct
! H, f& Y4 \" y- k{
& x: V+ y# r2 A/ M unsigned int a;
1 f1 W4 B# X/ u& c7 K7 p unsigned int b;! p8 t$ U2 P, q% G8 L) @& V" |0 Z
unsigned int packet_cout;$ g! o. a& O. e% \. c- K: V4 c% h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 o- m9 Z8 M4 N9 J) w) S. q
3 G) q! K. H3 C* q8 c) Fvoid read_MSG_buffer(int *baseaddr);6 O$ N J# q( L- F. r
unsigned int count_copy = 0;# ?* p& C, O$ S0 _
( G3 `) Z1 Z7 G3 J) S- Cint main(); A! a' W. ^. Z" r( A5 ` ~- G
{4 R1 F, f, Y- e7 B( y
int fd;$ ]: s7 N8 n# @; u7 D
int *mem = NULL;
' a7 J2 [1 Z) w. S9 @
S: Q' S( t. @" m) D3 ?) G if((fd = open("/dev/mem", O_RDWR)) <0)* _! O' K2 a1 n1 e4 n0 } O! N5 N
{/ k- v" c0 v U% a4 W/ h, h
perror("open error");# W0 e" X) t# p% ^4 U/ G. [
return -1;
' i. w. l' N7 p- u( Y }
8 F2 ^- K* z/ G& i
7 _" ^ @( H8 c @ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& F' T2 c3 w" ^" j: \* Y$ N+ }# u' V# E
while(1) ~& U% |; g6 I, h F6 y3 ]6 x
{
* @1 X; x$ h s; C- Z& Z H4 x, a k read_MSG_buffer(mem);
6 y* u7 Y5 x2 |7 A) d0 x5 A, m } 3 \+ ~' l. q* _- F4 L
}5 j4 P! q4 h( L8 C. X! q
0 h( M/ ]' d! |' U3 \$ A, L& Jvoid read_MSG_buffer(int *baseaddr)% Z) N1 j; t# e2 b/ f3 e
{
% {* E* ^+ }5 Y0 }1 g: Q) f pRX_MSG_PROTOCOL pshreRAM = NULL;6 J$ g2 g0 W8 Y' o) {' x
- ^6 B- o9 \- f- X pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ ?- b- `* @- L \6 w7 Q
. y& t. m2 S$ [- J if(pshreRAM->packet_cout != count_copy)
. F* J2 ^3 u) X8 E% E: P5 I E {) G- Q8 h4 k1 d, }' I: K# `3 C/ |
printf("a is %d\n", pshreRAM->a); R" q z6 S1 k# p& X, h
printf("b is %d\n", pshreRAM->b);( Q8 P0 e6 D$ b' p) u) m
printf("count is %d\n", pshreRAM->packet_cout);
. h! O" A' q! Z count_copy = pshreRAM->packet_cout;4 {3 o7 g' |. L- o D( \
}
, y, z; j; p% K- q% y( v& W9 _ else$ _) w3 }) B, u- L9 u7 M' ?
{
6 m% F5 ~% T' { printf("No effective message!\n");, W0 m: m3 Q% D/ f8 O
}- ]; n& J% B T% K. K d; H
}: _' d: |1 O; O G8 i3 f( C
/ \8 J1 s- p& e7 F没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" B+ m _2 d1 v8 a5 g! l l. X
( i/ A" n/ c" ?
: z9 Y, ]' D2 B5 p3 v
/ ^+ |9 A# }2 o2 R B$ J
F/ G1 n- G" ]6 w5 Y |
|