|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 N" F; q, H( g+ C
# z' k& F) b8 K: L7 g$ g
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, C# F4 H: O, ~3 f0 j& Z! B/ J#include <unistd.h>
& R! K! w2 y& P4 W; Q6 Y#include <sys/mman.h>% Z7 a" b6 q& M! {; B
#include <sys/types.h>, D) i& @8 ~! c& u' o: P
#include <fcntl.h>
. y8 K! k* g' F* q6 V/ k" z. [* D1 P0 v- A$ W' S( U
#define SHAER_RAM_BASE_ADDR (0x80000000) ! t1 A' L" i& j/ A
e- [. g3 ?# j1 u& m" Stypedef struct
" w9 a/ @5 W) e# Q9 S" X7 `, P{
7 p1 M) x2 m' @ unsigned int a;: H- y8 r7 ^% G' c
unsigned int b;
, X( N# G9 t; { unsigned int packet_cout;: S4 l6 Q2 t$ y% z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ B5 w: `, L9 u6 n
* G. Z4 n: S2 N1 ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 I y/ [) L% n4 [unsigned int count_copy = 0;
9 E$ d' |5 z6 R2 \' c8 K9 b5 G' B1 i5 B) s# F' O, `2 u- \
, f$ U6 s) S! U+ J) u
int main()5 d$ X% J, p1 l
{
2 I* S3 l, p: i2 k pRX_MSG_PROTOCOL pshreRAM = NULL;
$ F7 l m3 v+ W! N3 c0 r0 T" a pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 m' f: A3 N4 I
% _$ U- j/ f# f3 }
while(1)8 M1 S) v' T5 B( t% e) i, g$ ~
{7 i7 X5 K7 ^( b1 S
read_MSG_buffer(pshreRAM);- J* v. \5 I; r$ j6 M; I1 E
}
( p4 d" C& B. D0 \. N7 Z}
% r6 W) `. `% B, g' r5 M! q0 d2 U# T& m4 P5 P+ O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- T( i! P% J4 D6 ^" v
{# j3 `! Q, E0 N9 Q
RX_MSG_PROTOCOL buf;2 i- n$ R! l0 G: S3 r! T
! q- q4 \( p8 U# e. @+ _7 n2 m
buf.a = pshreRAM->a;0 E: {: C( q! q. E9 L1 V& G0 D! X9 F
buf.b = pshreRAM->b;, G5 c; V; k+ \0 R, {
buf.packet_cout = pshreRAM->packet_cout;& R6 h) Y, U% X5 [
, I# W9 t3 r; Q$ K( t
if(buf.packet_cout != count_copy)4 V5 p& _/ e1 A2 s! b+ \
{& x# Q4 Y w$ Q
printf("a is %d\n", buf.a);. L9 d* `$ ~# M# N' [3 n6 h' T$ }- i1 e
printf("b is %d\n", buf.b);2 l& O& r$ K# v
printf("count is %d\n", buf.packet_cout);2 W6 Q8 e+ K v. g% |3 W- H7 e
count_copy = buf.packet_cout;: L! B3 ?6 s* ?/ Q: S
}
# O! E8 j. ^' ?5 b% W) `6 |/ p* j else
4 s8 `; q' x8 X4 \- C {
4 b$ G# I3 B" X printf("No effective message!");
- A" r2 b# @# l6 x% i }
7 p% x" k7 a% R: a}
4 y: w$ f4 Y. b- s- t6 M9 y
9 w7 }% x8 N' i3 B: @( X5 s c* R" i; m0 M
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( ^3 x/ z& Z+ d0 ^ X) ~) T使用下面代码,对内存使用了mmap函数后: ^: e% `& X- r
#include <stdio.h>
, j7 k- D- f* ]# i7 b: l7 F7 u' _#include <unistd.h>
, p! K+ R" x, _4 R- J5 x8 | _#include <sys/mman.h>
) w' `% n! N# R5 A/ _#include <sys/types.h>
; X# N! g; z% I, U' h! v#include <fcntl.h>1 d( V( v: {) m( I
/ k1 ^$ S, U+ L' S
#define SHAER_RAM_BASE_ADDR (0x80000000)3 P9 |' t0 }% g* K2 t1 b
#define SHAER_RAM_SIZE (0x20000) 2 Q+ {$ U3 X1 I& Q2 f1 L
* D& y3 T# ~ Z* w3 G
typedef struct
" j8 x9 j; M# V+ O{' \, d: I* g) T8 O6 p2 m
unsigned int a;: G4 Y5 y4 t5 ~9 C `9 F8 w& e
unsigned int b;
6 \! B; b: P, O1 V# D/ Y8 y/ [2 p unsigned int packet_cout;
+ f$ ?" a) m+ x+ q7 x: h7 Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, D/ N( V# c2 T9 e. t3 H# O
5 x. @3 w" j- @8 ^9 }$ ?
void read_MSG_buffer(int *baseaddr);1 \8 K& W* X$ [' C/ i
unsigned int count_copy = 0;/ [0 `# s- n5 I
, Q. W; v/ t! R. o5 I- p
int main()
, a% A9 S. f+ U( j$ V{$ k* J) Q; C% b, l
int fd;
: D' ^( L# K! {2 m int *mem = NULL;! S3 ?/ Y+ D! X1 T3 O2 n& J# I
4 m( c/ w: z3 t, q0 F
if((fd = open("/dev/mem", O_RDWR)) <0)1 l$ V: Z9 G6 r
{! ]# ^/ z% G* |, d8 P2 _$ W4 n
perror("open error");
6 o; E m8 d' t5 d! F& j return -1;
% g& y4 C1 Z) ^ }
" j2 x( y+ t- ]+ ~1 J
5 n+ Z$ `2 J9 T; h mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' W3 u3 Y. q+ ~- z
$ Z6 }, |' b- t4 [; k while(1). s9 I; e) m, _0 |+ S+ |3 E% f. F
{ C( y) u8 @$ C+ i: _% s4 {
read_MSG_buffer(mem);, w# A4 B, p8 j1 P. V+ M& _9 y
} & J& _+ b+ d; e G
}
# e" S! Z+ b; P5 E
! O% q; u- G0 Z$ T. m9 ^void read_MSG_buffer(int *baseaddr)
5 ^" _1 K( P- p- w3 \; d; E7 V3 D4 p1 D6 K{4 ?, h( i, Z& P& o) ]7 y4 N- Z
pRX_MSG_PROTOCOL pshreRAM = NULL;* I' Q- X U' T- ?# i
7 N: c4 L' U* D. [; D. q
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ |' R0 K P1 r$ F( y% B8 `9 Q8 Q
7 E6 k% R9 s& a. y* w if(pshreRAM->packet_cout != count_copy)6 d+ @4 ~0 w( }( E2 V
{. K: l+ k- a6 M: m$ S- }
printf("a is %d\n", pshreRAM->a);" ^" t. l% v& `9 I. T4 F2 o ?: _
printf("b is %d\n", pshreRAM->b);
- n* i$ H6 g( J+ f s5 ^( d6 e* B% v printf("count is %d\n", pshreRAM->packet_cout);: r$ ^5 p0 y5 m% _0 k. c
count_copy = pshreRAM->packet_cout;7 q8 n' Z1 Q$ W" D+ G, j
}- o/ i* r9 N/ _" D# U6 k- m
else
; l' y7 n8 N" I) R0 ^ {
k. S6 e8 i0 W' Z' F printf("No effective message!\n");
- X5 ^4 R+ E L: _ }, U. Z$ R0 o* l! C. i, r
}
- ]; k! N" b0 E- Z+ h$ V% l \- @
7 d) V0 S) j, o! K没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 h3 p, L1 D `! p" z5 y% N
1 @' i |- g' L: {( T
4 ?' t7 X: g& Q+ b; J. v8 c% W' J4 q) A; c2 d
6 z; S y/ s) G8 g |
|