|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + ?! o3 S- Y2 L. h5 `9 l, r3 S
4 R- ~; Z! u( i4 y& I# L) D; @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h> t9 A- N7 ^4 I
#include <unistd.h>
5 b# _6 W* A' k3 R8 |1 N% g#include <sys/mman.h> P/ p3 S% u I1 T, @; A% b
#include <sys/types.h>3 c+ Z( g5 D- |& G
#include <fcntl.h>
2 o7 b' S/ \+ |9 `% f$ }9 P6 I; s6 L3 U
#define SHAER_RAM_BASE_ADDR (0x80000000) $ `9 a' V+ z* g/ v6 n
7 J z* b6 I( t% R7 k3 x
typedef struct+ \6 k7 }6 E$ M6 G. M
{1 W L- \4 z# K5 [
unsigned int a;& s# [6 B+ x2 _; K1 F) \7 s$ o& x
unsigned int b;1 w% x2 K: ~9 ~( _
unsigned int packet_cout;$ g3 ?$ R+ g1 T3 j8 K+ G3 h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 l1 M( U9 j+ G" K
0 E9 J) ~2 S' B+ L" L! Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 t& U8 a+ g% J( s' M9 J: M9 [unsigned int count_copy = 0;
" V5 x7 w: X+ ]% R
0 x# J/ Y h3 W0 t h; y# p, v4 V3 n% G
int main()
9 ~: _( V5 d; O0 S$ o- J, i! |{
7 e( I; I* k B- u% B# C pRX_MSG_PROTOCOL pshreRAM = NULL;
& d9 J5 \% |$ e1 i6 c& Z8 ]" Y9 ^ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, T" D' C2 J1 |( a" U0 X7 Q# S# B: j* B7 ]; i3 c) @
while(1)6 B6 t7 W# r: w( j
{
3 N7 |. I& e! q! R0 W read_MSG_buffer(pshreRAM);1 q( ^' x+ w1 j7 ^$ j" b0 S
} 5 T/ p C+ f- G) C, ^
}
" Z' u/ f; h' V* D) r. J' r* E- b% q& h: i% t6 h3 M1 [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! F* i# f/ W+ c{# F7 x1 B( L) O' A
RX_MSG_PROTOCOL buf;
) ^! t; ]% C* |6 a2 K3 b' O
' R) a$ w+ S, O3 c5 ?2 v buf.a = pshreRAM->a;) \7 q* _& P G! n _! Y5 y/ W
buf.b = pshreRAM->b;
. X4 j* g! F4 T2 n buf.packet_cout = pshreRAM->packet_cout;
4 z9 A* w8 O) j' ?5 j' s9 m ! }* Q2 ]# z8 `' ]9 u
if(buf.packet_cout != count_copy)
+ q7 k& u! Y; g$ K" b& s: q {
7 l& D; v: G5 T# _1 t6 J* ^ printf("a is %d\n", buf.a);2 k; L' O" S- B% Q
printf("b is %d\n", buf.b);( g: `; f Y0 [5 U
printf("count is %d\n", buf.packet_cout);4 ]; s1 t; C' A' S. z4 P
count_copy = buf.packet_cout;0 [2 O& \- u% E1 L% A5 H3 a' P
}6 U$ f# A9 @1 s6 I
else
5 D0 [9 a8 Q1 m3 ? b {
9 P0 t9 O8 _ }: C% e printf("No effective message!");# M9 D2 ? n- w
}
* P" a) j5 {8 n; P+ Q2 a! O}
( W" F# g1 S& Q1 q# }# d5 C a* {4 I2 [7 n' t1 v
" j2 k7 z% `2 C$ }. s% `但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 v8 V* W. k/ S ^使用下面代码,对内存使用了mmap函数后:
# G" N* ?8 k8 K( v* g9 n M% j#include <stdio.h>
( w, j$ A8 l9 G- a- d$ B. k#include <unistd.h>
' E" Q I- Z7 c2 N#include <sys/mman.h>0 }% K* o Y c( f# S
#include <sys/types.h>
9 X* o% C, E l: x! q#include <fcntl.h>
5 w- I# A. Q$ s/ c4 B0 Y. K, f5 I$ g3 h x7 Z! K( _
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ E; ]3 _3 `; F; Z#define SHAER_RAM_SIZE (0x20000)
+ N( ^7 \1 Q' j4 S# H% S2 i x
; |5 p: ^, T( h( B& i( }typedef struct
5 L7 b/ a) T% r{
2 |& a: r; h d& [( ~) z unsigned int a;4 z, t$ P T% l7 D4 O7 h
unsigned int b;
/ }( \3 O/ k0 l% u4 o; I+ D unsigned int packet_cout;
1 a' e _3 Q7 Z p: F, p- A) L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 C9 I8 [# ]0 y6 e- h% L) r) L% |" L& H( G+ P' i' o
void read_MSG_buffer(int *baseaddr);
9 t8 S2 a3 s9 Q, Lunsigned int count_copy = 0;
- V. l. r& ?# i+ P' W6 Q
" _; Q% k5 j2 ~, P% B! _6 [int main()( @ }. n3 q" Z1 r! I
{
" c3 n5 u) A' ~# F/ T, Y int fd;
1 @; p" K7 ]/ N) i) n1 ^+ t$ h int *mem = NULL;
4 E7 T; c9 R4 M; M( U$ w# Y* b1 A: D1 |4 E8 s
if((fd = open("/dev/mem", O_RDWR)) <0)
W$ A" V. u, O" z {! L3 R: U V8 x2 W* x& G3 Y
perror("open error");
' o$ W6 m0 T' K5 ^* K2 W& d' o return -1;" M6 R# a) }# g' Y* i) ~$ E1 Y
}
, t! K/ P# @) w8 o 4 @# ?3 L/ W, m5 w( F$ E( E
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ L* R& D8 t- j9 D8 z" n% Z4 a
& a/ F( z9 R" }' Y, s. E) j
while(1)* X5 y: T" j+ {8 F$ M% n: e C: X
{
5 h+ X! H$ D% k! ] read_MSG_buffer(mem);6 _* I, w. \) v( i: W8 U/ ^
}
e3 x C+ [) {# M4 i- y}1 }5 E6 z) |( I$ X$ X) U5 Z3 M
1 m9 E( Z7 Y: `6 E9 h8 V9 w2 k
void read_MSG_buffer(int *baseaddr)
/ R* r* o" O" v2 D) b/ E- q{
, R: J6 s% Y6 ^- C6 P, w pRX_MSG_PROTOCOL pshreRAM = NULL; f+ F" [0 d' S6 K" ?% Z
: E( J: Q9 B- [# c pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
d0 T( e7 T. }
. N8 M" }9 t# e2 D1 }! W/ k if(pshreRAM->packet_cout != count_copy)
7 Y: G+ C6 z0 e0 B, G3 L3 M {
3 M3 }# Q( W3 z7 B s5 [3 q printf("a is %d\n", pshreRAM->a);; t8 w! ]+ n: ?
printf("b is %d\n", pshreRAM->b);" I9 u0 o- k( \- Z9 u# _8 F
printf("count is %d\n", pshreRAM->packet_cout);! E" y+ G/ Z) q6 V' \, T
count_copy = pshreRAM->packet_cout;
5 u2 p( f" Z5 l7 E: s }' C+ ]( k- P3 X4 \% ^1 w; U
else
- G- s* N9 h8 O) ], r3 @ {9 A3 \) p; P: h: T4 i8 f* U
printf("No effective message!\n");
$ K+ \; p; s7 k* S; k }; }* G- R! A) U: E
}
& V5 u) [2 D0 O5 M, {5 M9 F# T! y4 V7 t
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ ~) h( p- ~ T L4 m t4 u* h, b4 T* v- R/ ?
# |; C- G" \3 a( k% Z) B7 P# W8 Z: Q$ d
l2 B* P* W* \( I+ w
|
|