|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
{' a; ~- Z% w7 K- z7 v
& J r% b8 m: F pOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 v3 X. y# J! h1 c0 c/ k( W
#include <unistd.h>
# C3 ^5 A7 j8 v+ O7 F#include <sys/mman.h>3 P7 r {, @9 u" o; _1 l! t
#include <sys/types.h>8 r! u' C5 }. [9 d
#include <fcntl.h>+ R1 h/ l) O5 e+ j$ w
9 x* U3 y) j u, }% x0 C6 h#define SHAER_RAM_BASE_ADDR (0x80000000) 7 F% W, b9 Q7 D6 ^/ @2 b
8 x+ v- B3 v/ V5 j6 c) v
typedef struct
2 X2 q5 z) C" T{
# v$ h9 M) Z' h6 J, c! s unsigned int a;. b) A V" N4 r$ I$ h9 Y8 b
unsigned int b;
9 t% @$ f h# w9 l9 k unsigned int packet_cout;, B, r8 p8 z- ?% t. t- R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 j3 w, n' h* A: J* M, S g: {; E @- N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ ?. o* N2 ^! E
unsigned int count_copy = 0;
: s* }- W7 d" p% \5 {1 ]& m' J6 {/ r# R0 U& r N8 [
; w: h* |. l' V2 f' y
int main()/ |' y& [# }4 V ]4 N2 W
{6 x% \( M! p8 p
pRX_MSG_PROTOCOL pshreRAM = NULL;9 k7 F G/ w/ `8 O- l
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. A8 T! [2 N0 C2 I) k7 H6 W9 W# M8 n- V* P! @/ l0 L$ r0 a
while(1)
4 a, z. K- }' F5 \ {
A1 Z& [* ]& Z; k! a5 ? read_MSG_buffer(pshreRAM);% N) m3 t' g0 q& k9 j
} 1 ~2 ]# ?" O0 D+ w* d0 s
}3 I7 u' f9 f+ B+ t: [& y3 }
% }5 F# p) y/ h" p" w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% e. E0 G! R+ \& `. U/ Y/ k% L{
A( [3 K2 i; Y0 Y RX_MSG_PROTOCOL buf;6 X, O6 Y0 U' z0 b+ G) X. N& x2 J
8 T3 K( B7 N+ \( V buf.a = pshreRAM->a;% l: P- n$ A+ |8 K! D, {: [& |
buf.b = pshreRAM->b;
& q5 A$ p7 W! Y& O1 }- \ buf.packet_cout = pshreRAM->packet_cout;
3 F! A' }' G. U' g% ^& ~! B" r 3 X3 R7 K$ R1 C. T% G2 Z, K
if(buf.packet_cout != count_copy)
; f6 S; S/ Q6 D+ B7 q0 }! j {0 \+ T* U9 { D* n3 @2 i
printf("a is %d\n", buf.a);, i) T3 z; M* y1 X) @* E" V
printf("b is %d\n", buf.b);, g# u; \+ l0 x/ N$ O w. ^
printf("count is %d\n", buf.packet_cout);
7 f& \: F4 j. E: L count_copy = buf.packet_cout;9 L7 z4 f6 N8 Z E
}8 p1 O, o# L# D
else
) S [# b8 ?5 l9 }* b- z9 c; l! o {& M0 ^; k: i2 E$ j! S2 R7 H
printf("No effective message!");2 e. w; g8 C3 ?4 h
}
5 m# H+ w+ F5 M4 y' {& B}$ a9 u6 l% q$ q% S
9 [0 J8 W# ]8 ~. {6 S* w
9 s+ Q N, T. @) x# E: B3 x" R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( u" b$ R8 M3 h6 L# n' C使用下面代码,对内存使用了mmap函数后:! E) j" d* a' A% W9 z1 V: d
#include <stdio.h>% i+ h5 I8 u% F( F& y/ b5 H* U7 p$ y
#include <unistd.h>. i8 i. L% }0 r$ B; v G
#include <sys/mman.h>- o6 q+ j/ [* k, F1 {) R( S& z
#include <sys/types.h>
: \2 M6 z3 J' K0 }1 @#include <fcntl.h>
( V k: {. y3 w* A; G. s: {+ j7 q; \& L4 r7 b
#define SHAER_RAM_BASE_ADDR (0x80000000)
( [3 \" {2 b8 x- Z/ o! I/ b8 K#define SHAER_RAM_SIZE (0x20000)
, W0 m; ^6 W3 A+ |& g) I
3 w7 ]9 L* E+ A' Vtypedef struct2 ?4 b: `9 k) G* m# v+ r( O
{& y3 C$ e1 p& f' O5 R
unsigned int a;
/ @6 P9 {2 d6 r) [6 p2 A6 d1 w8 W* [ unsigned int b;1 }- C: y7 M' M% k$ |
unsigned int packet_cout;2 ~2 q* Z( c5 c1 F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 R4 A7 i( G' U9 w4 ]. p
" t* a5 P8 O9 Avoid read_MSG_buffer(int *baseaddr);
% c2 v' ^& `0 tunsigned int count_copy = 0;% X+ f/ c1 N4 k. m1 x: p+ G+ W
- _% D# N, @1 h
int main(), J" `* ?* d4 a* E9 T
{( t4 Y: _% l) Y: S! p- p+ i
int fd;8 l( ^8 [9 I, H& o$ _
int *mem = NULL;
$ D5 N( l- G) R: q4 U
& W0 c7 M! Q& L. I+ F1 ?# z if((fd = open("/dev/mem", O_RDWR)) <0)
8 u! ]* E N7 i' ~9 u {
( H; G/ J& O# V9 H. D4 A perror("open error");
& N/ y3 a# D' y { Y return -1;( k9 q' z% _7 C- Q) b
}6 k5 u8 Q! I w6 i$ C1 k c
. N5 p0 S, `- |1 d' n1 I- \3 r/ t+ t mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* [+ _1 n7 G& x! j- v0 G+ m* y) }
- w9 ^0 ^+ E9 P* Y6 E& e while(1)
& j* {4 u) G2 M+ _ {
" {- E! O: S! J read_MSG_buffer(mem);' n3 W" V# ~1 g# q
} / e) q5 j4 X0 T% Y: J- X+ e
}% ^8 c# h! |, [/ |& R3 {
! l& [) v) B v9 |3 V) A
void read_MSG_buffer(int *baseaddr)2 r H4 {7 G. H9 [" |
{
7 l4 q3 g. ]! L0 `0 `: h3 G pRX_MSG_PROTOCOL pshreRAM = NULL;( w& Y5 G" E0 M1 D5 n
" `8 n i0 [; f- r5 l7 W, ~2 @8 ?
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: Y6 C8 ^" Y; x# n" o
" O! a) \8 r9 Y5 l+ a# i if(pshreRAM->packet_cout != count_copy)
; ~7 ~2 m+ k* b- k8 o, d0 r {
* K- p5 s& F1 y) ^7 q+ |; j% B printf("a is %d\n", pshreRAM->a);$ o+ j/ d2 v' g7 S+ q- j" Z
printf("b is %d\n", pshreRAM->b);5 B! I. H+ s, F- C7 e
printf("count is %d\n", pshreRAM->packet_cout);& Z0 b% L8 W8 q
count_copy = pshreRAM->packet_cout;) H2 u/ C! t. x: i' I1 Y0 \
}
+ g; p4 t- O% x6 P else
' f( q; u) c2 @2 W7 r { U7 x6 \/ P; M7 N. O5 @
printf("No effective message!\n");% O- ]$ O! a% |; N/ d
}7 E2 V' ^, _9 t- |3 J
}
; ^5 l e z7 i- ~6 r6 l1 Q
v+ j" u6 O8 C6 L/ y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& w0 _. `# L3 O3 d( n6 X" Z0 t8 o2 V/ i+ [$ |
( P9 N+ }) P" O' V' c/ [6 ]0 R
+ n: f& Y1 j! ^; z2 c( s0 c' R2 X8 ?
9 ?2 i N' p m* N! R4 p8 B
|
|