|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " `* n' u5 U" H2 h4 E) [1 I/ u+ n7 v
- K9 d) o; e8 G+ r I3 G6 |OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. c4 ^% |2 \* F' F
#include <unistd.h>
. x& p# C& I% I1 Z$ h" ]/ A( W, `. H#include <sys/mman.h>
& `9 l$ r4 L/ [+ Y$ p1 n v) j/ n#include <sys/types.h>- A# E; q" N9 J4 z; F9 ~+ q
#include <fcntl.h>
6 G: m2 p: q5 J' a9 H% v3 G5 b. W* q: }( u
#define SHAER_RAM_BASE_ADDR (0x80000000) & o8 p" x9 w% M$ d. q( ~
- Q4 h8 ?. b5 Ttypedef struct
! K& i$ O4 y: v. g% m; J5 W{
7 S1 Y, G' B& D unsigned int a;
' M" f* I; V1 Z: w+ \+ f8 Y unsigned int b;
: p' k$ }. M( n/ i$ V# ? ~ unsigned int packet_cout;; ]" R2 L* g; S" K& e0 r5 Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
[1 \/ c) J' f. j( i H$ p0 W8 `. ?- N/ K f k8 F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 X4 a$ F! E+ l3 J: @
unsigned int count_copy = 0;
# N+ n) Y$ W, _2 g2 j2 _, C# t) G6 o8 t8 u$ D# z
1 ?7 i6 }5 o& x5 ]1 hint main()9 x5 S. f! |7 K, a
{- u! U8 S2 ~: c0 R- ~ y
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ \ I$ Y$ o# i( V) V6 _ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 i5 \% a, [$ F
/ d& h7 w3 @: u' m% f while(1)
- H$ ^1 M$ q- d: A5 R" o {
$ K% [0 j0 ^! I# X+ P: t' v9 s read_MSG_buffer(pshreRAM);
* b0 v$ z c% k# ?& e' w& d% _: ^ }
, J4 f; E! d+ f% n" i8 h5 {}! F/ v' u% `: m* R* |: o+ Z
+ e3 @' d3 ?+ R9 tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 p- k- _, R3 Q8 [
{5 J. K' P$ f: \2 p+ [
RX_MSG_PROTOCOL buf;" p" N- N5 V5 D0 ?. r, {# _5 z
3 N% C! h1 o: D- | buf.a = pshreRAM->a;
9 [6 l/ ]' B+ J% \# ~) \ buf.b = pshreRAM->b;
! T8 u+ |+ c) ~3 T5 d6 a! A buf.packet_cout = pshreRAM->packet_cout;
( I/ l4 }/ |5 f ) ]) U% j) W. o- ]5 E
if(buf.packet_cout != count_copy)
6 ~4 i6 ]+ v* a2 W {
3 q" U& ^" y: K! S printf("a is %d\n", buf.a);
3 M3 t/ |8 G) |. O1 Q' | printf("b is %d\n", buf.b);
8 y7 j/ |, ?0 ?4 Q printf("count is %d\n", buf.packet_cout);
( P" C3 s9 }* N+ Q count_copy = buf.packet_cout;; f: v5 M, u5 b
}
$ i: W6 Y: |( ]/ I( p6 |2 b: C else
9 K! N! I- N) P( g: n {
0 K; l) x- b$ x" g. N) I; ~ printf("No effective message!");
I2 t, \4 Y9 |" _) y) a }! I3 m A5 |" s2 q! U
}
4 L0 |% S% b/ N0 k# @& j- j" [7 U- J' u% W8 w, ~4 {
+ x3 \& J" g Z; w, R& Z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 @: r2 i7 z8 m2 C) b: x6 m _1 N使用下面代码,对内存使用了mmap函数后:
5 Y7 G; |. E$ I# l/ E#include <stdio.h>$ t( M Z. N$ v B, B
#include <unistd.h>8 d' J8 I( e. o
#include <sys/mman.h>
3 d8 C. z2 r' `% h3 @* J7 ~$ A#include <sys/types.h>, b9 ], Y. K; L: N1 F! @ `! J
#include <fcntl.h>
}7 n5 r" R' g. B* [9 y9 |2 p9 A4 I* U* o8 R, @7 n
#define SHAER_RAM_BASE_ADDR (0x80000000); A U; N/ n& F' m5 V. k3 ^ t5 T
#define SHAER_RAM_SIZE (0x20000) 0 W% |' e% K! ?! n; [
1 w" a2 U+ r0 ]6 X7 f4 p4 x) t
typedef struct. u/ ]2 X& S* |/ y% P- t
{
8 c# H) D! D1 D unsigned int a;# V3 u( V( f+ A- j& |" ?
unsigned int b;) [% f$ L' p. ^+ Z# y. K7 ^
unsigned int packet_cout;: z8 n' n9 i5 a) a: [& l1 Z* B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 ]+ ?, D5 i8 o5 I" X# d
$ _: ?/ } I6 x9 Vvoid read_MSG_buffer(int *baseaddr);
) d# e; @) ]& T% l: l, I9 Punsigned int count_copy = 0;
|: a% N4 C: t6 k
# D; }' t% c$ @2 sint main()8 o7 ^5 E% R" x. U6 S
{
' i' t+ D& J* ?: {# P: I/ a# y! k int fd;1 L' k) y8 s) B: d& x7 q
int *mem = NULL;
$ ? [, z& ^$ \) k
1 N4 ]" E# v' U- Z' K: ^ if((fd = open("/dev/mem", O_RDWR)) <0): Q% }4 ?; T( J' n
{
x$ y0 ^. a# A+ H* W1 |2 ` perror("open error");- N: ?" v! n+ V6 [8 n# S
return -1;* a7 }% \4 V# O" w9 a
}( Y8 b) B0 n1 T& ?; v3 R: B
2 c9 `* V5 l8 |7 ^7 V& u( ^4 Z
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, G7 F& Z6 m. o" F9 a! Q
9 [: j" l* c- I) ] while(1)- {% {6 q$ F: b$ x
{: `* V% K) o9 u* j8 ?
read_MSG_buffer(mem);! \1 E6 }: d, X- u
}
6 s7 C+ T- J0 m$ @}
2 {3 W$ E( ?7 F" d! r, P
1 |7 _3 m/ p7 i: y* w; ^0 {& W& Bvoid read_MSG_buffer(int *baseaddr): [5 w4 A5 U$ |9 l- ^# e
{9 u% t, ^3 s9 b6 I0 e
pRX_MSG_PROTOCOL pshreRAM = NULL;1 d+ O5 d1 B) E: e' x3 c5 M
& f% e& F* o) l) x% N pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: c! D8 a9 m8 n6 U% \5 ]8 g
3 h) K' `$ d( d' U: w if(pshreRAM->packet_cout != count_copy)4 u2 n3 `0 X( {" p- ?+ G
{: J" u" ]: Z: P* `% j) o6 ~# _/ o
printf("a is %d\n", pshreRAM->a);
- K3 S& }& e$ L printf("b is %d\n", pshreRAM->b);' Z4 w/ z8 S' S8 [% v
printf("count is %d\n", pshreRAM->packet_cout);! _4 F& S# k, C8 ]$ M4 l J
count_copy = pshreRAM->packet_cout;$ z& y8 D. v# l7 `( _
}2 J* b( h+ J2 u# z( G$ A
else/ K5 R3 [; r N, a: G$ Z3 [4 d
{1 _3 b D" H) G8 F- D
printf("No effective message!\n");
9 H' ^8 Y7 e. r2 A9 b; l) ^ }& I/ _; Q0 A s! x" P, Q' b
}# u# P2 k# x8 `& ~# z0 {/ N2 v; K
& u* n% G6 B$ o9 j没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???8 V" M6 W: F/ j) w$ e$ I) U0 b
- U$ x& m: Y2 U) R
, n; g/ ~2 g- [; e P% E {6 T1 a$ b3 _- d# R
$ u2 {: i0 j5 A5 H3 n
|
|