|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 b$ C, A" J# l3 D- n/ F" Q: P0 e" W! Q G
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 f8 \$ v5 m9 G3 k8 ]
#include <unistd.h>: Z) ^8 ^' W" N: h7 |# G
#include <sys/mman.h>. O( }7 J1 [, Q0 t% |& e
#include <sys/types.h># u7 }* ]3 [. U: y. G: j
#include <fcntl.h>6 U4 S1 @& z4 @! j
3 @3 F0 ^. f8 L2 D1 a7 @#define SHAER_RAM_BASE_ADDR (0x80000000)
0 o. a0 e$ R6 X6 G: I+ b
. @8 ~; x* E$ F9 ?1 W0 ^typedef struct2 C! |9 ]' e: E0 N% K9 Y
{
+ V8 y. L. u8 @, [ unsigned int a;
- S* V {: Z/ }! M( T unsigned int b;
3 L. L( S& l. ^* h: g( S+ s% _ unsigned int packet_cout;! C$ q+ ?) g4 V7 [5 F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 z9 {" b1 k7 k
% I x1 }! {' l! z" D4 ]( [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! B, F d. U% m# kunsigned int count_copy = 0;
, W/ B6 S2 q s% {0 F
& r8 m* q# a S* m, [* F* N' y2 j- z3 I
int main()" c* g0 a% M) t; o1 [3 n- O
{% F# `' v) A$ h6 o; v% |5 U( q0 M
pRX_MSG_PROTOCOL pshreRAM = NULL;4 m" }2 f. \2 V1 g7 }4 X$ ]3 b" {
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ Q2 |3 Q% {9 b2 e9 y6 |* @: `$ n6 e% ^7 R H2 j' A8 A3 x. t
while(1)
& \* B: |4 |% c# M g { w0 V$ x8 r# I: {! r
read_MSG_buffer(pshreRAM);% h6 z! U: W+ {
}
|+ q% [6 i$ e4 l3 o- M( z}
% k) M( I+ e- l1 h0 J) H% K# E
2 c7 A4 ], u o5 m4 E5 d& w/ o% avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% P: {, b! A! @+ Y; g |5 |( M$ W{
% h8 Z( K D$ l& u1 a$ e. A RX_MSG_PROTOCOL buf; |! s$ s/ v0 M' V/ w( y
+ r( \; T9 P# G9 z& R" ? buf.a = pshreRAM->a;
4 ~! p( E' _0 {% V8 A) { buf.b = pshreRAM->b;+ f8 s" t3 y8 ^
buf.packet_cout = pshreRAM->packet_cout;- T- \% M2 Y) E9 v; l
g R. @+ _9 x- Q6 l/ ^# M
if(buf.packet_cout != count_copy)' R0 s3 Y3 ?5 P# M2 _( C
{$ a0 F% I+ F- y/ S& P8 u6 Z& H4 g( N
printf("a is %d\n", buf.a);" D6 V) Q# X) ^/ s4 b3 h
printf("b is %d\n", buf.b);+ D \$ Y/ w$ q8 C/ d% j) a
printf("count is %d\n", buf.packet_cout);, e- q1 D* J( W3 f4 J& s) q
count_copy = buf.packet_cout;. b2 x0 b1 O# ] k6 F4 }4 N8 T
}2 i3 q0 A1 d$ W4 P
else; a- W: s) c0 h2 W5 }6 p8 b
{/ S1 k7 |# o3 i5 X; ^
printf("No effective message!");. t+ z% V$ ]" N! V
}
& b# W9 j* i o" f7 a0 x}- [6 E& ~' G, V7 c1 X# ?! M
4 n( s) M, o1 `7 l0 P
7 F4 U/ U9 _/ `6 {: d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% H1 `) s: ^( j! E W# R1 I
使用下面代码,对内存使用了mmap函数后:
5 {( b+ E; ?1 z1 {4 T: F#include <stdio.h>
/ G) G' j- p& Z1 B9 a2 r) Q+ P#include <unistd.h>
+ b, h) i! O: d0 Y8 B7 m5 Y5 n#include <sys/mman.h>
7 u4 ?0 ^- W3 l% `9 ]9 Z#include <sys/types.h>' a' x3 Q* ?/ @, a% N
#include <fcntl.h>' @) ?3 H+ N3 g7 [, f ^( [
( `% H0 T9 T& b: g#define SHAER_RAM_BASE_ADDR (0x80000000): ?3 E9 O" H' R& U3 g5 A: @8 H Z
#define SHAER_RAM_SIZE (0x20000) 9 O+ T7 @9 W8 i, }! E( G
" O7 B( r0 K# {( T8 htypedef struct# }8 ^2 J: d3 Z
{
" A+ ?2 E, N9 Z3 ]8 ]5 I unsigned int a;
$ w) H( A% a' a0 d& R unsigned int b;
2 c8 ^1 R! |* X unsigned int packet_cout;; U+ P& Y- z0 q( {8 r- E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# O5 T4 p2 q6 U5 B& `; H8 x, W
7 R( V/ f m/ G
void read_MSG_buffer(int *baseaddr);7 V( S* N, u, L4 v/ G& K4 s# w
unsigned int count_copy = 0;+ z0 v0 _ d7 @9 ]/ [4 R
. ?" X# o) |- r9 }& q: Yint main()
9 A2 R" y, Z& G4 n+ \{" x- ?, `! V# g- G5 K
int fd;& I# J/ |# @: r: ?
int *mem = NULL;
, X, _3 g* \) R% ^! Y( Q6 m6 N. Z1 g6 Y. a
! R* s o( l; x: t8 ? if((fd = open("/dev/mem", O_RDWR)) <0): f0 V4 r, F r
{
& Z9 ~1 r! ~3 |% o( W perror("open error");
+ P+ }$ W$ M) y+ P L2 ?$ a return -1;
+ C# `3 e+ v, q* R% \8 T- z* V }, W6 c4 B5 V6 \9 ~! R9 y
% V/ o [9 g5 }8 A$ y: W" K mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: T$ X) @6 i# x
+ g* K( j) r3 z/ t# s% Z$ c" A0 G while(1)3 d) d+ @- H; x. m
{
* f. r0 d1 R% h% s( k read_MSG_buffer(mem);) k; n5 V/ f! A1 l
} . ?( m$ G2 Z% U4 M' k
}7 ?. Y1 ^6 {- W( n& u
- S9 E7 N# ~. k0 [9 l/ j5 E3 jvoid read_MSG_buffer(int *baseaddr), E1 D* m( E$ Q6 ^
{5 F" w: j6 C- q. Y
pRX_MSG_PROTOCOL pshreRAM = NULL;& w0 E; T7 X8 M3 K
# Y0 h9 A; N% _' K3 E& e4 C pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 S; R: m9 H1 `. R/ Q; ~: X& S ?8 K
if(pshreRAM->packet_cout != count_copy)
0 z( L' p$ N$ T# h {4 b, q0 d/ a6 j2 \3 d0 F, S& g$ v, P
printf("a is %d\n", pshreRAM->a);# q. S- ?6 p; \, y$ o3 L/ X
printf("b is %d\n", pshreRAM->b);
' k9 T4 ]) p& }" q6 C8 ] printf("count is %d\n", pshreRAM->packet_cout);
& f# B! ^$ t7 e! t& \1 j% u0 { count_copy = pshreRAM->packet_cout;
% W! c6 a$ V' P- f }% K: g. E( y, s! J5 }! e
else- D" L* U% j- E
{
R8 S* T( d, j, F printf("No effective message!\n");% o. Y7 O0 Q3 ~; E8 F; Y2 N4 a. |
}, f$ W2 {( I3 h3 {- c* x4 k6 x1 w
}
+ U; s: G/ D* y$ ?% K# N' u' S' b5 Y% R% ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- J& v6 h: L& m" x p( E! k6 c
' Y6 q9 K' |3 O# i8 [
4 q0 g* H8 {, ~" D/ o
, o/ r1 j" `( m$ r- t
$ m/ m; ~% z* }7 I |
|