|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) T' U+ ^% k' B1 m
* I! ^$ k* y) h1 j/ fOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ b2 A5 u# q# V" J$ H#include <unistd.h>
$ p- U7 N. _0 O7 ^, ~& T#include <sys/mman.h>. _* S! Z: [+ h: _+ q X+ g
#include <sys/types.h>3 N+ k' N" H' a7 u
#include <fcntl.h>& u' z4 O. A# L
1 |7 ^- Q0 [, u8 z6 |, @# t
#define SHAER_RAM_BASE_ADDR (0x80000000)
, @- W9 G2 F: l' j3 f$ Q' S
8 Z* W1 d2 R" P5 qtypedef struct
7 D1 w3 R: a: O{4 ?6 J% `* L% J
unsigned int a;
; v; \0 z! `. H- x unsigned int b; P3 \: m$ H9 V/ J D
unsigned int packet_cout;
. K b9 h7 t; Y8 X+ h; ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' Q) A5 Z( l% E/ M* o
1 M; j. v' ^" xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 n% V+ O9 D l
unsigned int count_copy = 0;
0 V! u l- a' D/ w. `; F/ M" y. A. K) K, P6 x4 M; a) z# \' e6 |
/ n- [) z, A2 d( R' t
int main()
9 P3 [- h0 [# z! \, ?4 \. j{
( W$ Q* n' o3 g0 [8 C+ z8 h& G$ \ pRX_MSG_PROTOCOL pshreRAM = NULL;0 U+ P5 a, y5 G+ A3 d5 r
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; T# Z# w2 i/ q9 g, G& ~
9 Z' E" J8 N Y8 E* Q8 F while(1)! e; \2 w. m& a' J, K
{
6 q) Q. L a% B) C- h' I, Q read_MSG_buffer(pshreRAM);+ ~1 E, N( r0 g
} 2 e- N* `' h6 \; R4 d8 U3 u& `/ j
}1 B7 N, }0 z# d' b1 A) l
3 S/ `9 I' w0 t. h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ J# J( R5 [& W' f
{) a3 I `' x' [! b) n% W2 i
RX_MSG_PROTOCOL buf;1 G6 M$ i3 F& M4 I, }
& T& J* v* z3 ?3 c- G7 T
buf.a = pshreRAM->a;) e1 K$ I8 r( J5 B
buf.b = pshreRAM->b;" Y4 k. n6 }( w; v% l! O
buf.packet_cout = pshreRAM->packet_cout;; J7 @2 F3 s1 s8 b( ~8 ?
) J o2 l0 W) c A0 b+ O if(buf.packet_cout != count_copy)
: Z- l( |+ i; s$ k# X5 Q {
, D' t# Q8 F5 p w; k& P6 i ?7 R ] printf("a is %d\n", buf.a);
( g/ M' O O3 M7 w, m. z2 p9 T. Z printf("b is %d\n", buf.b);
% N7 N) b8 M/ j& Z printf("count is %d\n", buf.packet_cout);2 g" _. w% T. O* `/ D) }) y% j
count_copy = buf.packet_cout;2 \3 q% @& c7 `- X7 T3 g' M; K' V- r2 q
}
$ r" F4 K2 r# B% n9 w/ i else' B* P/ M0 `" m5 b/ R n; N( V
{
# B0 r- J# C5 @- ]" a printf("No effective message!");, c+ J" T1 t# O4 a, Q% o( K7 K1 G
}
, E. j0 [9 [$ W. Q}
4 Z+ ], l& l' g1 {/ f& j$ u& {9 b7 B7 w- ^ f0 w
0 L0 D# r' m/ V. q* c
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" Y ^5 z1 c# {4 `1 e/ `使用下面代码,对内存使用了mmap函数后:8 Z4 z( l: g3 G9 Z# v. ~
#include <stdio.h>
$ N. H5 s1 o+ [4 l1 n7 o9 P1 i$ V#include <unistd.h>
* g8 {* l2 b* @; t5 _) ^#include <sys/mman.h>% J! X2 ?% y1 m6 U; C& u& H
#include <sys/types.h>" @4 G" ~4 n% o5 N
#include <fcntl.h>" b: V! U: A6 E! U2 H
1 t m! U5 s; d- a7 g( P' A
#define SHAER_RAM_BASE_ADDR (0x80000000)
( J+ o6 c0 s; {- b2 }" u6 k5 G#define SHAER_RAM_SIZE (0x20000) 6 [- e5 e% q2 p2 ^3 Y
; o9 P( S! D; z+ ~7 U+ U
typedef struct6 p. H9 R4 b3 }2 V% ^- N
{
u; R: [4 N B, i" k unsigned int a;
' G. `% ~: t; G# V% d0 k/ S+ m unsigned int b;: }7 q2 y: M+ R+ N* {
unsigned int packet_cout;- g% f2 ]& V( T5 i+ y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 {$ u( B3 S7 P
9 t2 t0 g: v3 y3 wvoid read_MSG_buffer(int *baseaddr);
3 M9 S! B$ e2 W" `. k) N# J9 h+ g) _unsigned int count_copy = 0;
" ^( w4 S8 E+ U9 E% W4 t
- P" @" b7 x4 W7 n& Xint main()0 i$ b& M# ]8 S2 y
{* d3 r, b7 n+ b5 M; x
int fd;
$ x: [/ d$ g( i: K% O' \ K int *mem = NULL;4 z! F* W) b* S& f/ E" d
1 J: ?4 F" _* R. u% [& S& ?
if((fd = open("/dev/mem", O_RDWR)) <0)- `9 _3 o! i9 r4 {3 N8 R" |
{% d p U& y! k H
perror("open error");
. D, q- _* y9 c& y return -1;
3 H- x/ R- f4 d0 }4 Y1 C2 g4 }9 c% v }! o% H1 x4 M( L* ]3 y) ?
% V3 n4 I U0 W* k& k! t* |! [ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" {: |* `& T2 s% V5 D/ _
% x( `/ R! D1 Q' N3 R: b; C while(1)
* W; k6 R# g+ g: q& ]' m {' v, t& @( t& \7 Z* l8 g
read_MSG_buffer(mem);
" Q2 {% Z! `0 R7 { }
, r! {6 T9 }6 B/ H& u: B1 F# l}
- I* a" ?$ Y7 @7 @8 Y) n4 s) g" a* `& A' C! ^ c7 A
void read_MSG_buffer(int *baseaddr). M. |9 S p: j* v
{
" R% P& |2 G2 D8 J3 ]+ c$ ?+ c pRX_MSG_PROTOCOL pshreRAM = NULL;
' _" v* S; R7 M7 W C$ R( P+ z8 y2 |$ f1 U- H
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 D. @9 m, W- t# v7 B& b7 e* o
5 i/ ^ G, R& y0 V" s4 \ if(pshreRAM->packet_cout != count_copy)3 X! {0 z; j W* d% X
{. g) l7 x$ R7 E- H9 M! z' e
printf("a is %d\n", pshreRAM->a);6 q- r3 A6 A. e3 o9 i. [
printf("b is %d\n", pshreRAM->b);
. h7 q* e3 I, s+ b printf("count is %d\n", pshreRAM->packet_cout);
3 t3 X6 b; u: [" x$ @9 @ count_copy = pshreRAM->packet_cout;
5 W3 E0 N) c* K }+ @' o C1 O' T7 W
else
7 B$ i7 N3 b. s' n. L ?; s {
: J- M# V) x9 j1 Z0 ?" D1 x3 N printf("No effective message!\n");+ @8 z7 Q1 o& A( E$ t
}: j0 Y1 S4 t3 J# c. Q
}) I" k y# c3 z% V
" f6 B6 p5 y) y1 i1 g: C没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 `# g& c2 S9 N+ \: G0 g: Y# n
\+ a) @$ M% Z" D$ P; P
9 M" [6 d$ a* o* l
% {5 a- L$ S( D6 j: @
h; }! {) |8 V9 n* i& b |
|