|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! O) H% e9 p4 G! r# [& B
8 }2 t0 A% A, c& \1 u7 oOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& T+ ]) k& w' y
#include <unistd.h>
; y7 \' p7 d( r) n$ N#include <sys/mman.h>
( F3 C7 a7 X# U' Q$ F& ~#include <sys/types.h>9 ]7 v5 O* b u1 x
#include <fcntl.h>1 P0 J6 C+ E+ [3 l
?9 T" N9 `0 M9 g% D1 \" Q% L
#define SHAER_RAM_BASE_ADDR (0x80000000)
; i) F, [9 |+ g# n4 U2 d1 Y& @; w/ l% [" h$ y/ ?- {
typedef struct
# W1 b9 U3 p; N, H- c# o{
" `$ D, h9 c: C- ^ unsigned int a;
- q5 L1 u* h+ k1 N3 T } unsigned int b;
6 s7 ]5 D4 I4 F1 K6 U! y/ z, A- A unsigned int packet_cout;
# h* W; [8 `& s% @; E1 j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' R7 v! L& [7 }$ R ~1 \8 M4 V
" d: D" f( @% R6 Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);2 J; Y. R7 h G* Q# M& I j
unsigned int count_copy = 0;, s3 T: H8 \1 Y q8 u- S6 H$ R
! ?7 G7 Y# P6 l' F0 ?. ^( d3 ^, q5 \
' G# b/ T% _4 ]+ p- Y: u! }2 y2 yint main()6 {* M/ o9 ?- q
{
0 g+ k$ I V/ E& n, C6 ~8 x pRX_MSG_PROTOCOL pshreRAM = NULL;
$ C0 ]- T& T: e+ F pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! O2 R! P4 V' `; E" Z# q! {" X" ~
while(1)# o) b" H/ z0 O/ h+ M" H
{: K, ]- H4 u' R) u K
read_MSG_buffer(pshreRAM);
( X" @' H0 u! t0 i# I* L }
" o X- s" ^8 h, B/ b0 v! r- Q: j}2 x# ` D( p6 z9 ]% m$ B' p$ N
0 x [2 b' Z% y) @2 ~1 z v. ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 q0 P9 u7 X$ f1 ]6 u, H{! `& G1 u" ^& r! o/ a
RX_MSG_PROTOCOL buf;
8 N2 n4 w( ~; k' |) ]
" Y- u: I% `8 G w) E buf.a = pshreRAM->a; j, j& x; B( T! m. g" e' p
buf.b = pshreRAM->b;# |0 g+ Y4 F2 z8 a& ^
buf.packet_cout = pshreRAM->packet_cout;& `- h$ L+ m4 h0 u/ V$ X
$ t& B W' i8 @4 f6 Y if(buf.packet_cout != count_copy)0 r! f9 ~ g- }' f/ O" z& z
{
0 B3 j9 |# s4 T5 t' o+ L printf("a is %d\n", buf.a);
9 e ?# I, U, y* ~ printf("b is %d\n", buf.b);
. Z) G2 p0 h3 R printf("count is %d\n", buf.packet_cout);
( f* G, R4 ^. A/ g' h$ g g4 N) Q2 V count_copy = buf.packet_cout;
9 ]1 }2 [+ w- `% `' v }5 a! z" S1 F1 O4 z, `
else
7 j2 {$ T' w9 w {$ Z' Z8 t- ~ z0 C
printf("No effective message!");
0 ^6 n0 ^6 [$ c! Z2 Y" W3 n& a }7 X9 t4 m8 @( U- `( W4 B
}
% x# n% C7 f f$ C7 e' x
- P+ @# J/ a/ D+ d2 g1 T. G: X/ ~- z) H: Q+ j1 N$ ]
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 q+ E+ C% c; U3 c# H
使用下面代码,对内存使用了mmap函数后:3 G- H# m" M! G. p
#include <stdio.h>" i$ w. H8 T) p3 F2 J) H t4 c
#include <unistd.h>
, {) T% z: E r8 }#include <sys/mman.h>1 M' E# R5 Y; W
#include <sys/types.h>
7 J- v4 _. x/ Z! d0 V#include <fcntl.h>: B4 t4 B. _; C1 M8 C6 b
( ]5 k; p5 f' d2 J5 k0 Z#define SHAER_RAM_BASE_ADDR (0x80000000)
2 n* N# H: }8 t0 u Z1 X z% q; c# `#define SHAER_RAM_SIZE (0x20000)
D; @, S7 Y3 |. B
- C6 v& }# {# Itypedef struct
- W3 V, Y8 C7 I' ~; B; x; t+ ~{- A. ^8 l7 w$ n" o( ]( W5 X1 {1 `! x
unsigned int a;' Q/ U6 ~- c1 p, {, ~0 @, M
unsigned int b;
) M5 Q( A [5 l! G unsigned int packet_cout;
+ O1 l3 _" C8 S8 r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& _" r& K# a c3 u
' ~6 R8 D' N5 K! Gvoid read_MSG_buffer(int *baseaddr);9 o4 Y( p- M$ ^2 u f w
unsigned int count_copy = 0;
- v& @: F }! L
' ^' ]4 g+ K% W0 j# v3 Fint main()# Z2 t/ G/ j2 O
{8 ^, k' S& }4 ^
int fd;( F0 N! d% J; x5 M6 {* E
int *mem = NULL;
: }0 Y5 ^ J4 M
/ ]$ v, }, O o. p+ a4 u if((fd = open("/dev/mem", O_RDWR)) <0)
' `" ]! w5 U1 l% s8 K8 N/ F' r {' I# O1 T ^* `. `
perror("open error");
0 k# c8 D* M1 N0 v return -1;) J+ y4 U3 p v) L. I
}
- o: s3 Y w' f$ B$ p / z3 R$ j0 m3 w4 t
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' n: e9 d' e5 i9 _" r% Z( @2 Y3 f- Z8 F2 L
while(1)
/ {- |9 \# y! a3 V# B {
9 n9 n% l( j& P3 G. [ read_MSG_buffer(mem);
: H; L+ s5 N( L1 i9 p) |% l4 d }
2 ?: h# a$ T2 g0 t; y}
9 y) [' i1 u) V9 V) X
, @( X4 r/ @( |6 N5 o9 Vvoid read_MSG_buffer(int *baseaddr)
6 |5 A0 @$ t! p4 q% v, f{
" n4 @1 ~0 z% m/ g9 P pRX_MSG_PROTOCOL pshreRAM = NULL;
, }' t0 S2 J, I) T* \ E% I; _. X3 S/ Y6 p3 M9 X" i
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;8 e& [3 i5 |) r6 M @. V: z/ O% ~
" U% a, c5 D4 y
if(pshreRAM->packet_cout != count_copy)3 p n: p% ]' {, Q
{( W& z3 D1 E& {5 c
printf("a is %d\n", pshreRAM->a);. H' b1 |* T( V8 Q5 \
printf("b is %d\n", pshreRAM->b);
5 @% Q0 \6 i6 M; }, ~7 f8 q/ `' v4 f printf("count is %d\n", pshreRAM->packet_cout);
: |' O' Q: I# u count_copy = pshreRAM->packet_cout;9 `1 @5 A) Y4 I
}7 K+ Q2 E) k' }# H6 e8 A! E# l0 E8 r- N
else4 @- b( [5 O0 @- b* y2 z& ?5 j% a d( f
{! }3 N' f6 ?$ g+ ]
printf("No effective message!\n");% y# T1 r0 ?; D6 C3 g& S
}4 q! N& _. h$ R
}# J) T( ~ d0 }4 Y; `) e; L3 V7 p# Y
5 g/ H) e8 \9 V5 s1 D! S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% F( v$ H, B8 ^7 K/ R3 G6 ]; a6 R3 f' t0 a0 |5 ~7 S$ ?6 @
9 r' t: a: T5 V3 o4 O, f9 d: C9 y7 s
- ^8 N* ]+ c: Z9 T! T6 g! ]! R& j4 ^, Q: K6 @8 ?
|
|