|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 G0 W* o8 k, o! v' {! e
$ o& O$ p1 v" M) w- N
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 W B& f4 y% A) g d) C- L#include <unistd.h>" z& z1 h% x) M
#include <sys/mman.h>+ u/ o/ m3 y+ f0 ]% r( q
#include <sys/types.h>1 e) z( _% r7 w' _/ }
#include <fcntl.h>2 v2 `7 s# c# r; }' l3 T& l1 R
K8 E* B* K' `( L% R5 \#define SHAER_RAM_BASE_ADDR (0x80000000)
* f% v& Z4 x2 [9 m: u Y" {$ v2 V+ f. p* e7 W1 Q, ^7 Q
typedef struct5 M2 [* v* f# L
{
$ r1 g; b6 N- q( S, j5 i- f9 l unsigned int a;
! }/ \, N1 M! R4 s unsigned int b;0 q% d3 E. i) Z' l. p& ]1 |
unsigned int packet_cout;: g5 p- L" I2 l: F5 e; p$ d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 {* N: A7 X# P) O# j$ x1 t
5 M" b( a& @9 K7 t. uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- E- `( k1 c: x) ^& _8 L5 T/ nunsigned int count_copy = 0;
3 G, h. y! E( }( M5 l" K
1 l1 ^6 B1 |: M
0 ` ^0 X! X# Yint main() t9 K+ E# F3 u4 a+ B* _* }: o
{
4 i0 [; \7 s0 K% y% `0 R9 V pRX_MSG_PROTOCOL pshreRAM = NULL;. }( L2 U4 M( ^; _# ]2 y3 u
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- ~; `/ c g5 B! k7 m$ j' ~9 f# d/ |% C
while(1)
W7 m8 N" d5 ?( x" }% M {; P* D& c% P7 D$ V" v+ {( K7 I+ \
read_MSG_buffer(pshreRAM);
3 D6 c8 P0 g7 ^$ G) @ }
0 Z! i/ _3 x9 h6 Z}3 C8 \, `& L0 \9 J8 S6 N# d# L
4 ~* {/ `. |6 svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 I6 M1 \' @+ o7 @0 H{
V3 b1 r$ f+ W( n( q5 v RX_MSG_PROTOCOL buf;0 e; G* n: }( m- N
$ G/ P( T8 _: J* T0 s3 Y buf.a = pshreRAM->a;6 _( p/ i y! z" L: `8 e! i
buf.b = pshreRAM->b;
& d* ~2 E% n; [9 h: r buf.packet_cout = pshreRAM->packet_cout;
1 @& Z6 g9 u0 [0 F% Z. e( M
& Y3 b$ X7 f/ b) W: h* n8 ? if(buf.packet_cout != count_copy)
% _1 @; ?8 z' ]. ?5 u& J4 ]+ v5 c6 a {
( @# o1 M U: c- M7 A printf("a is %d\n", buf.a);$ s# w( H! `/ d9 c% E! I t
printf("b is %d\n", buf.b);
* G/ w0 p: O2 z: V/ M: i9 j+ P printf("count is %d\n", buf.packet_cout);
( M6 O1 V9 L; d( F$ ~3 ?7 N count_copy = buf.packet_cout;
/ k2 {$ S6 N4 l) ^9 ?! t1 u% U }
9 m; B5 y/ F n* V) [ Z1 E7 { else2 O, M) `( E3 |. G5 k4 F; [
{
: N' ~& n) W# M& O printf("No effective message!");
# [3 g6 a+ R8 i }: ^, S$ b6 h7 T
}
# l* Z" ~' m1 m( }9 | c3 ]$ B3 z& G. _$ c2 `7 C/ t
* x* Z& ~& R q; `* U但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- l8 p6 Q5 J$ V8 ~0 _使用下面代码,对内存使用了mmap函数后:
" s/ R3 U4 b: x) S$ X9 f* \7 e, L& O#include <stdio.h>2 ?: F# A, ^2 h7 V( L; @+ V0 }
#include <unistd.h>
- \- E, K/ N, _3 A2 E* p#include <sys/mman.h>* G% z* U* v2 v
#include <sys/types.h>2 R, a1 u! S7 o/ k8 o+ B. f/ W7 { g# n
#include <fcntl.h>
- g" H5 K4 {, m& }- H( M* m' s# b; H( f
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 S) Y0 x9 s- o( e- t: V! Y#define SHAER_RAM_SIZE (0x20000) C$ S# W! a9 m) F6 o
" h/ r. N' ?/ |/ f# \
typedef struct
' x( S' P( h/ P' }% K% k{
! Y/ _/ d9 a6 F Y3 H unsigned int a;6 Q" v3 ?( I, `8 p1 H0 A2 ~- q
unsigned int b;- Y& _+ _ s; i- G. {- U/ s
unsigned int packet_cout;
9 S0 F! B3 I P( h# \, [1 f8 w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 I% J( ^& {3 V+ q0 `8 ~
- f; E& q5 Y3 E$ w; Jvoid read_MSG_buffer(int *baseaddr);
: r, \) W( v. J6 Z" I$ Gunsigned int count_copy = 0;
% \% h6 z+ L( u" G1 v; P, K, }6 O' U
int main()
- }2 ]1 M2 o, T' H! t{2 G: D/ Z; X9 H/ ^4 Z- k/ N
int fd;
! w, `/ ~" I; F! C int *mem = NULL;
q$ f: U1 b0 w( s" v0 C+ q& `3 J7 g; P2 _! V
if((fd = open("/dev/mem", O_RDWR)) <0)! s. X) y4 N* ]6 U/ C
{
2 y6 e* H* }6 e; J% t$ y4 V6 f5 |& C/ @ perror("open error");
o" }2 K7 ?: L7 s u return -1;7 F1 Y' u$ Q8 r5 x! r. N9 |0 }# J
}9 o1 `7 y$ M& h3 ]: P- B/ ^+ ~8 l) \
4 q+ F8 A9 ]7 T N
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 v6 v& f) V+ X# x- t" S& L' d
9 i. e9 l% A X |- J% S while(1)
6 J/ e0 z/ s3 k/ I. m {; {* b7 G/ C/ k: a
read_MSG_buffer(mem);
. S/ l. `# s8 M6 x8 q, ` }
: E* `$ L2 ~" N9 Y1 S* j7 d" M}/ M4 w2 y. i* k; O( d f/ ~
8 A7 q, d' p, B# l
void read_MSG_buffer(int *baseaddr)- Q a3 K" u7 O
{
8 _9 j8 A9 h, ]7 u+ Q pRX_MSG_PROTOCOL pshreRAM = NULL;. f6 }8 g' v% d6 Z$ W! v
9 a( S( J d) |! C+ n' q( P8 N
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& b0 u" X. e# v2 Y& `9 o; R
- o; N$ V( ]! W if(pshreRAM->packet_cout != count_copy)' H4 n1 i [2 ~: `
{
6 S C, K3 ]1 t9 M2 L7 [$ r printf("a is %d\n", pshreRAM->a);( [4 r7 Q9 V# x1 H! N/ L0 ~3 g: e8 W
printf("b is %d\n", pshreRAM->b);
+ {3 Y* F' K2 t) t- X: N printf("count is %d\n", pshreRAM->packet_cout);
9 D1 p9 }* u- ~4 N8 K8 I count_copy = pshreRAM->packet_cout;
( Q4 z% [( ]# @* o- v3 R4 w }5 H! z4 L- v$ C# u% P% h$ C, o" E$ o2 s) q$ [
else
9 y3 q$ o- T; ~% M# w) t8 i) S {
2 K2 f5 @& K A" E' I+ n printf("No effective message!\n");+ E3 |6 d$ a# f8 J5 b: Q
}$ y8 \# Q# J; m. z# A! `
}
: \6 z- {( S, t+ h5 _' T
, @- \. ?5 h: {+ L. H$ }4 L没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# B. t2 W3 J9 k2 p: [& L1 f2 a3 [; e2 h" x
6 {% x: n: C) T& c# W: I$ q8 W0 j6 i" _1 }! a$ x
$ m& `' c+ A. Z+ b, k |
|