|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& R% }' Z* Q, W5 H5 J# g8 S# u$ ~# _& @. p6 k8 ?8 x) g$ B% S
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: I9 t* v/ G, |1 k% @" Y
#include <unistd.h>! F, C0 h& U, x8 N$ b1 {- i
#include <sys/mman.h>4 t' v" b: k3 g' a
#include <sys/types.h>
4 w$ x* L6 f! f#include <fcntl.h>, ~( [# z+ [$ Z9 o4 _" ^
/ r) ~) K3 S" D0 h1 Z9 P: b
#define SHAER_RAM_BASE_ADDR (0x80000000) * k4 [( S6 {* a/ c/ s8 _/ G
, R/ c9 G5 u f
typedef struct+ P& t2 @9 @# h" D) B
{2 \+ V$ t5 F' r+ z
unsigned int a;
# w* u& @7 Q: ~1 t unsigned int b;
2 Z: s& r- X2 D unsigned int packet_cout;0 ?9 P5 d% c. Z8 @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( u2 y, V( R3 F$ Z2 Z
Z( y4 ^4 N! A- m# L: u, E( a0 }! _void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( {7 Q* p( v# ]unsigned int count_copy = 0;
0 v! @5 _$ ? W8 d' K) V2 H( Y$ ` h9 @6 ~% w1 |) ^
; ~ r4 \* ?$ b) }5 qint main()- v. x* h& D# I% B
{% k$ F! ^! @) r1 B! E+ Y( e1 g! i
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ h/ B: a5 h- i# y+ t pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ c/ ^6 l4 N" g
( U6 y/ f+ l; b5 p+ ^! V I2 J6 a while(1)
) k, U% l/ o2 O5 r! u/ @8 \" a {8 I& {$ N4 g5 f# E
read_MSG_buffer(pshreRAM);+ [$ y+ T* ^$ k2 _' U, ~3 V1 _
}
# f4 k) w, |0 c& b' x' B} R4 T8 t0 _) Q. F- J# w
0 U7 c- W; |6 M& s/ @) p( {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( T7 u' b+ u' l3 h' L{8 g& I$ z$ o6 R! J, }2 T) k c6 `; B' M
RX_MSG_PROTOCOL buf;( r$ d/ D0 ?: F( |
6 B+ C$ Z# D b5 t. q4 s1 o+ Z. d buf.a = pshreRAM->a;
/ z/ u/ n, G8 {! c3 L& b buf.b = pshreRAM->b;
m [; F4 t/ L( n& J/ B# d0 q buf.packet_cout = pshreRAM->packet_cout;
# U3 M6 P# z# S( Z5 ]9 _& E W8 w2 \: v% d0 {/ d" i2 n
if(buf.packet_cout != count_copy)# s) K- ?8 P2 J* v, Y6 U
{
# ~5 m, ^5 D8 j printf("a is %d\n", buf.a);
9 k% c, \* [+ e( Q printf("b is %d\n", buf.b);
4 ?( z w2 i& D6 q+ i5 Z( G printf("count is %d\n", buf.packet_cout);) n/ d% Q' w: h7 ~$ O5 F! `% L2 {) Z
count_copy = buf.packet_cout;
5 H) s5 w* y( J: c0 X% d }
2 B* R( t- J1 |! E2 I( o# `8 K# X L else" h+ M2 i$ y/ F" t+ h# l5 M: {" Q
{
$ `( A' y4 j( p- G: U1 P printf("No effective message!");
7 d5 {# V0 `* {" A1 P) k$ ^3 J }
% C# G4 G( ^# Q0 I: \}
, o2 i4 I% \/ p# n! T1 |" n$ _6 g* b3 v7 K" ], M" |
' X2 M) v* w. I' }但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; s& G; j1 r- e3 ?1 C3 ^使用下面代码,对内存使用了mmap函数后:* x, i8 [$ c7 M
#include <stdio.h> s+ h4 f& p2 K" N0 |
#include <unistd.h>% o0 C. I' K5 B1 T
#include <sys/mman.h>
U$ \2 e) n- x0 ?' Y, s#include <sys/types.h>' P- C/ P4 r) j H- P$ q
#include <fcntl.h>
8 E# u" E: K; q; }3 |3 ?+ J7 { b h2 m9 k2 ]( B
#define SHAER_RAM_BASE_ADDR (0x80000000)# S* P$ M) m2 q% ?% W1 T
#define SHAER_RAM_SIZE (0x20000)
! ?7 t( p4 ^1 \, E( h9 {8 B3 v6 j$ I3 I8 x& p
typedef struct
% h- m1 E- r5 a3 p9 m; C{! \2 `1 K `+ A
unsigned int a;) j& ~- P+ O" `, x# I( z3 P
unsigned int b;2 ^7 X# \7 m/ d7 o' w, ^* M1 Q6 a
unsigned int packet_cout;5 q% U3 I0 m) r( u2 Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 c: f. m8 A) z6 L u( B3 C v, b8 A B" |3 M3 p1 ?1 ~. v# E" w5 ~
void read_MSG_buffer(int *baseaddr);1 l! H# a, v0 Z' b+ {0 L
unsigned int count_copy = 0;0 S( J" q# U+ ~1 Q0 r7 S* Y
# `8 x. m1 S; R& G
int main()
' G8 o& S2 c3 S, ], s{5 y/ \) T2 h* N+ \# F' ?
int fd;7 ?7 W d3 N: x: D
int *mem = NULL; U% E# l* `( Q; Q1 F, G
! _4 N! }- l9 ?% f9 y
if((fd = open("/dev/mem", O_RDWR)) <0)
% K* D4 F: J* G6 { {
8 H; K- @5 p& ?- a3 x& N3 S# G perror("open error");
' w* f( v* v6 d' f/ a" o return -1;
" C& a$ t1 R# X' l6 x }) ^% }. G. s, n) o
" v& _0 t8 p& g. W
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 k: ?2 l" u0 P$ h1 r9 a( A& O3 G1 z3 W8 @4 h# |
while(1)) C2 i p. \ n: m' P0 A
{
' y' G- R" P2 Z2 S' k read_MSG_buffer(mem);
2 ]0 l% g: H* A" y }
$ L- Y* |+ D# ]0 c}$ K/ V4 G& ~* Q9 H, z2 `0 Q v
$ [9 I3 Z% F; G, Wvoid read_MSG_buffer(int *baseaddr)5 q5 ]) ^9 |" A2 ]
{
: U' q- A9 u- W( C- b( u pRX_MSG_PROTOCOL pshreRAM = NULL;
& l1 r7 f, N3 ^3 p$ m4 L" M9 K) K' e' ~. Q
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 Q! i4 `& K1 u# r
9 J; ~4 L {% L0 m' h if(pshreRAM->packet_cout != count_copy)
& s7 [. W m$ R4 w6 p& @ {
3 G: B2 v( z2 U6 Y printf("a is %d\n", pshreRAM->a);' r$ e1 B( g0 ~# L
printf("b is %d\n", pshreRAM->b);
1 T5 t% e6 P; I3 ~ printf("count is %d\n", pshreRAM->packet_cout);
" x; P2 l/ Y# v) q; y- Q count_copy = pshreRAM->packet_cout;3 I, o/ Q! x- \, q: U9 G1 g
}
7 u# M. n" V7 F- N else
6 E, o8 l# w- g0 G& F% E {" ~* I& g' e1 H' J
printf("No effective message!\n");( c/ \. h; s% b$ b- w
}$ Q6 \6 y( \$ ?# U: P4 P
}
( M9 W5 _8 {3 O
& c' A3 e( q* V8 T8 C没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 b2 b* F) N3 Q0 q% l' }( T
9 u7 d2 z# T+ g d) k
" ?: t2 m& \7 p# ?; P+ A9 V% e0 B/ L
9 |4 ~9 @% [5 Q* |& W
|
|