|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( O/ D' f2 k2 u1 `& t0 W9 _( ?& L7 s. b
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! Z" F! h6 J/ B$ s3 ~1 g# }, t#include <unistd.h>
5 ?4 L- Z0 B# R% O#include <sys/mman.h>' G/ c, g! u, h7 s6 q
#include <sys/types.h>
% q! _/ A+ ^ d: |6 y#include <fcntl.h>
9 }1 P. a0 p7 c+ z% W( m$ n! B8 I6 N! ?/ b
#define SHAER_RAM_BASE_ADDR (0x80000000) $ G% p8 o) Q n+ X3 F
0 A: |0 Y* n/ @7 L' Ltypedef struct
0 r! S# w. v% g4 K' P! q+ V) P& h! m0 ~{' w' W' w4 p: K! b2 B0 H$ A
unsigned int a;8 x0 Z/ p# ^: f/ f, G; t6 Q
unsigned int b;
. F+ C- [4 |8 H) r; A( ^# L unsigned int packet_cout;0 y- s, c {& ^# v _. }+ g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 G1 X) B4 H- K& d) }
) t" Z: N6 ~7 j# E% w: {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 i) H1 p2 a- p5 D0 C) ^$ m
unsigned int count_copy = 0;
% N- t1 {# x4 s% M
7 j9 }( S% a7 L* {. J, w6 z
4 V% k0 D) q' }! vint main()
$ ?) S+ F3 l [$ N{2 c7 T: d9 N/ K, m. j3 ^
pRX_MSG_PROTOCOL pshreRAM = NULL;
* @: x4 O, U% F$ p5 g pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% t3 x% z& B7 |0 d" p8 ^+ G9 a u% M `0 z8 I6 B
while(1)/ U, W) s/ U5 o- [0 n( S
{
% o, T% `4 f+ Z0 y& _ read_MSG_buffer(pshreRAM); a: e2 c/ u4 T) p
} ) q9 C }! Q/ {; e- n
}
8 a% \5 C/ b* e, f) ` c Z* U7 e2 C/ J! L; q5 {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 F/ O. e0 c3 L! O- @{
- M( V6 m& C W6 U9 f o+ d RX_MSG_PROTOCOL buf;
. b. w/ @, i% g/ u* A) ~
+ d% O7 `/ n# G4 e, g: D% @4 ^ buf.a = pshreRAM->a;) n# e) k" w6 |! r3 | {6 F2 V7 ^$ R7 ^
buf.b = pshreRAM->b;
' v8 r' n: D- V4 S buf.packet_cout = pshreRAM->packet_cout;+ h1 s6 V/ r* o7 {5 m4 T M, t
4 S. h. E( a; c ]. {+ y' s4 O# N5 k
if(buf.packet_cout != count_copy): V/ ?& |8 l# X( p {+ h
{
0 m/ g( c: n; T5 O. d6 {! L+ ?, t4 l printf("a is %d\n", buf.a);% @9 X0 U' U0 t8 _. R* x8 \1 Z
printf("b is %d\n", buf.b);
s% _0 I# h9 u; X1 }* Z printf("count is %d\n", buf.packet_cout);
. q9 W2 x3 J; p- w& K. _ count_copy = buf.packet_cout;
& _& e* D8 g( z+ I* g4 i }1 D! ~) w* X3 }/ `9 Y) H$ l7 \+ `
else8 x- a+ c4 @) g+ [- u
{4 \2 a" v! i7 @8 g
printf("No effective message!");+ U# d8 S7 A5 `6 a8 J1 G
}" ~+ s$ l0 W+ _6 D
}9 _* k5 |' a$ e$ t6 i
; [# X; e* U0 n% U" m+ Z* G9 k/ `. U, [- m& Q; U5 ^) x
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; q* d7 X4 W" i0 i7 I3 z
使用下面代码,对内存使用了mmap函数后:# Y) [" m+ B- I$ K; Y; [
#include <stdio.h>
4 n, X" f) O- E# @5 g; |#include <unistd.h>
1 }6 N) S/ _8 M% ]; I#include <sys/mman.h>, k6 [: R: i/ N2 |, \7 J
#include <sys/types.h>+ m/ g2 c4 v# D
#include <fcntl.h>% @/ V. J0 d8 F$ C, k$ f/ T/ P
% a% h/ w+ u: m- l% q/ i' g$ y0 F4 s
#define SHAER_RAM_BASE_ADDR (0x80000000)4 o$ ?$ u2 y# y) ~$ K6 [ j: o! ]
#define SHAER_RAM_SIZE (0x20000)
7 V4 u- P: u$ L( L% h
; Y* j& M1 R: y; [$ X! Mtypedef struct
4 T" c! e5 o+ f1 }. d5 J6 j; w{9 c# @& c2 \. m7 @
unsigned int a;
! d) Q& X6 G1 J5 n- O$ E unsigned int b;
% ~1 m( k2 x7 g |9 B! T; Y unsigned int packet_cout;& f n( p4 m; n7 O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ {9 l+ v0 ?( q- s% u5 L& O) r+ c$ P$ |; i, z
void read_MSG_buffer(int *baseaddr);8 r/ M; H) _7 |4 G7 p# v8 r
unsigned int count_copy = 0;
7 d5 F( ^9 ^9 [! V) }2 t8 t4 s: w" J, W" M/ D6 v
int main()
) F" s$ i# W9 U, j{7 l# C$ ~( m6 s1 R8 q% o9 B
int fd;: v9 \0 f3 _0 G3 e: K8 j' n* @
int *mem = NULL;. R _! r0 z& g- q
/ B* D" Q3 y& ~3 V& b6 W3 f; i if((fd = open("/dev/mem", O_RDWR)) <0)
/ p0 s l$ b6 Q& r7 L {
6 G1 n9 J/ t0 W: a" P' H perror("open error");
) p" ~8 e$ K; b5 W$ a: v return -1;
2 D3 W0 B9 t, T& a }$ P3 a; n! q& V. H8 c1 P- p8 h- ^1 K
' m! q; f5 S( X' s) {0 ~7 v# s
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" }% o+ K' ]4 G O1 x; c$ |0 ^
. t- z P- q/ O1 a7 E0 {+ V& j
while(1)( D' o% s5 X1 Y, s2 t
{ R# m6 R5 C9 l o, b- m5 E3 ]
read_MSG_buffer(mem);' x7 @: u+ l) A# v
} + H- S% W& f7 Q9 A6 I# C
}
U0 R4 ^/ F: h; f- T# ]4 ?$ F# v0 L& t; u% R8 g) @
void read_MSG_buffer(int *baseaddr)* G5 W( Z. ~- Y/ ~" A9 C
{6 `3 w. F: o- R
pRX_MSG_PROTOCOL pshreRAM = NULL;# F5 L1 G) z* F
7 r6 U8 I" t( l- Y3 u1 I0 C pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 {: v3 ]& U: Q) W/ F
; }4 [3 j4 Q1 U0 ?* L# b9 k2 H
if(pshreRAM->packet_cout != count_copy), d; `/ \' I2 r6 \, ]8 l8 w/ W
{
5 Q- a8 ]6 o1 }; s' \ printf("a is %d\n", pshreRAM->a);
- V( u4 t5 X1 r7 w0 q | printf("b is %d\n", pshreRAM->b);
- w1 {4 u8 P* {7 d. P" Y* z printf("count is %d\n", pshreRAM->packet_cout);
, R7 }6 K1 J: T6 m count_copy = pshreRAM->packet_cout;' |2 L% [6 I& H. w
}
a. Q2 t3 r @. w3 B t/ n' U else
1 ?) i9 t3 T, c( U- F N9 V {" r3 n5 U* a8 R
printf("No effective message!\n");
7 S* ]; \4 S) d+ V1 b }
+ Y. p) S/ W7 h8 O f- e4 j}; S8 d/ |. b0 H4 A* o3 x$ m
) Y; o( A; r v" e0 m H7 T% u
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; @% u4 p# Z: X$ K/ N# {/ _4 B
- K& o! Q- J. P* I+ d
; l5 N# [1 Q2 ^% t, n) M$ j
& W5 o$ |% R1 I
# v' V+ ?/ ^' p2 d; y8 M. X+ [" T* F. H" B |
|