|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # E: S. L$ w* r; v! A# h% e
- x$ k/ l3 k$ x T: n
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 C; i/ l4 y7 T: k: r" T: t#include <unistd.h>9 c* H, h- D% X+ Y5 U" v
#include <sys/mman.h>6 d. w" ?: \' }
#include <sys/types.h>
) V% [2 B, f! U#include <fcntl.h>
2 V1 _6 B4 A. X$ n$ n. ]% Z- V
( y0 L9 A' g Y; \#define SHAER_RAM_BASE_ADDR (0x80000000) : z9 R3 D6 |" D- [4 w! Z, P
- t0 K/ [+ [; itypedef struct p1 ?# L& D9 G
{4 \: M9 O @2 F2 W
unsigned int a;
/ G/ F5 e7 i3 _* F unsigned int b;8 I/ y0 Y) R: H, L9 n
unsigned int packet_cout;
4 |9 Q2 Y! S% v& n4 f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ [1 w0 q! k5 s6 Y
- ]2 Y' {& Q2 K/ o' B* v' xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& Q" a2 _: o A8 Sunsigned int count_copy = 0;
" }4 o' R1 K9 @; n" J( t
0 Q+ @7 y1 g1 {5 J3 {' h* f, u" _9 `. M
int main()
) P0 ]$ t0 {/ }! r{
! s$ Q/ o4 L( b% {/ A8 O pRX_MSG_PROTOCOL pshreRAM = NULL;
+ V8 s2 C' \) ?$ ~# G4 c7 y pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ [" u! J( s& w, s" O9 ]% B8 T8 t% D
while(1)
. Z6 v* J! c- H J. L9 J {
* L' p& b( Y! v+ ] ^ s read_MSG_buffer(pshreRAM);
% t$ E$ `+ h5 f6 {5 T: ^' } }
7 R2 H+ j+ Y0 X) Y, f0 {}
' g7 r: Q( j' E; ~* p
2 m& P: S0 ]. _1 J6 u ^# M, T1 xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 Z, D7 I7 _7 I: k{+ y" e4 W! N. z/ _" G" n
RX_MSG_PROTOCOL buf;
. v: R/ ]7 G | 7 o$ D z& N6 P1 f' z( e
buf.a = pshreRAM->a;
" k. g7 G. Z6 `& c6 Z3 t buf.b = pshreRAM->b;' y9 ?8 |. p7 v- E- m. J8 X% }
buf.packet_cout = pshreRAM->packet_cout;! r3 H( ^* e' M4 Z$ S. z
% P( s( r& P* a' Q/ t) j, w
if(buf.packet_cout != count_copy)4 J& h% Y/ Q: [5 [8 |0 W: r7 K/ m2 v T
{
/ G2 j" x" F( z8 P& B- V& q$ h" A printf("a is %d\n", buf.a);( E4 j/ [; R) P1 q; Q/ H
printf("b is %d\n", buf.b);
K" d5 ~" b* m. z printf("count is %d\n", buf.packet_cout);
4 T& y$ e& \+ d4 X$ N count_copy = buf.packet_cout;
" F; _, X/ J+ D+ H0 x }& n9 ^; G, f6 k, i: Q
else
" p* W2 I: E2 w- C% f {
+ K' S4 F2 E L( B+ d" c6 d printf("No effective message!");' N* m" }% s) Y8 i
}
8 `& @' f: m, b; Y& r- ~6 v) [$ w}3 F0 D6 S( w: F" }8 j; y
; y( H% B( h9 c& f' }
' M( F" q# \9 t9 R但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 Y! F0 r9 y: e/ y9 l. p
使用下面代码,对内存使用了mmap函数后:
' t& y0 @& x8 M8 L7 f* k#include <stdio.h>
. V% W* _6 _* t) `& z* L#include <unistd.h>
& s+ R# ]- V- Y& C0 e#include <sys/mman.h>
* g+ J& m0 K; e! q" n#include <sys/types.h>
$ S+ l, E- e' x#include <fcntl.h>
, i+ `: P+ b8 f" ~' R* r9 F& q5 {+ _) k6 H) e
#define SHAER_RAM_BASE_ADDR (0x80000000)3 E# g) e* k( e6 ?
#define SHAER_RAM_SIZE (0x20000) 1 ~0 |6 Y& Z* E
2 v8 {' z( b- M& U$ Y$ jtypedef struct( T: @* H y2 b# K9 U$ l
{! C [# n- P9 }% _8 ~. l% _
unsigned int a;& E0 y" V- g6 ~2 E |; M- z
unsigned int b;) K7 Y8 d' q. A+ T/ m/ [+ C4 m7 X i
unsigned int packet_cout;
4 @. t& R' X8 z' ^}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 f/ v! T. d# [! C' T
: Y3 u( {) _' E% n svoid read_MSG_buffer(int *baseaddr);
( P2 D+ F3 p* |% T5 Iunsigned int count_copy = 0;8 H A+ i: `5 V' t; h
! [1 Y1 [- O( u/ d
int main()7 b2 d6 N- T" p& A6 ?5 d0 g; d7 v# b
{! \8 z! P6 D+ w9 t) Z
int fd;+ W! D4 ] K7 a& B) v6 u: y- J
int *mem = NULL;& z/ C$ l2 X4 b6 z& M
, }0 C/ B1 z+ M" L if((fd = open("/dev/mem", O_RDWR)) <0)! h" W- S. r, c) q
{9 P6 v9 _) q- t- \
perror("open error");
6 Q" x& U- I" R" b3 T' u return -1; H; J& r7 K O4 Q$ n0 x
}. M. L; y# J' o2 r$ o
- b! O9 d) E1 [# i6 o/ I+ d/ l
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ V, H8 Q0 ?3 W
* }% O- x1 p9 I while(1)6 y9 b+ B0 l; s) J
{
3 _* u" t. S4 r$ s. u read_MSG_buffer(mem);
7 E, {: I8 q6 O' k- d1 C }
: `" W: E$ U, e& x6 R+ v# z9 y+ y9 ?}
E) a" A0 [0 D# ~- c( f% l7 L$ |& N# [+ \
void read_MSG_buffer(int *baseaddr)
, k: {& q J @: f7 h5 x{1 @* N( I4 C/ I9 u- p
pRX_MSG_PROTOCOL pshreRAM = NULL;9 {6 f- O" |+ k9 n
2 @) @: Z5 ?6 U% W% ^: [7 N" q0 F4 z
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) ~9 X, [* t# I) m
0 z; R s0 W5 w3 g6 l! Y if(pshreRAM->packet_cout != count_copy)9 g' M" i! @* _! }) U
{
9 s0 x* K8 E. d& c) o printf("a is %d\n", pshreRAM->a);9 C1 E5 N0 f; q& z
printf("b is %d\n", pshreRAM->b);/ s% d5 w4 s% @' h$ Y
printf("count is %d\n", pshreRAM->packet_cout);8 k3 h( L7 a& e3 E: a
count_copy = pshreRAM->packet_cout; B. N: C- v: v% x0 ^
}
# s0 s; ]* c6 ?2 H/ Y" S8 W2 N else2 n& _- E' L) K, x+ r( ~
{) Q" I7 j& s5 r* w+ q
printf("No effective message!\n");1 ~2 _3 T) ^6 v$ U
}2 Y! o& ?0 A, s+ S3 X+ M' F
}3 m$ I; p. I6 d8 i. ^8 u
6 l) [. ]* {% F# Q3 u& `$ \' s: ~4 b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? f( p1 z" f' x* `8 t; @
. o5 _5 G7 A- K$ m
5 o- C: R4 x) |* s1 n3 l
5 `; n; l* @7 z/ R& [
4 a% G' {0 N3 T# V |
|