|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 I/ W E# R/ d; w9 B
' S) ?# A; C y7 K# z2 v7 m
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, I5 D/ S) }# U* Q m
#include <unistd.h>
6 T+ i0 p: a x3 d1 m( n#include <sys/mman.h>
' B& s7 {) r e, s#include <sys/types.h>" S/ V0 g E A+ A p
#include <fcntl.h>
9 c* j. A1 ?0 s" T) n9 S5 K' V) b5 t0 m: y! p! ]# @
#define SHAER_RAM_BASE_ADDR (0x80000000)
* U& Y) r- F0 Y5 Z& n& l3 `* j# M# @( A- q$ D9 J8 c# i5 {7 K
typedef struct
$ [0 x0 ]. C& `8 m{% Q8 l% u/ B5 [2 }+ L8 h0 J
unsigned int a;3 }4 R4 \7 W0 X. b
unsigned int b;2 k$ z" Y7 T- a' @2 V1 E
unsigned int packet_cout;
6 W: u d8 x1 S4 c) T$ F3 |5 p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( X) r- l; W, t; @) g2 N; Z' H' y7 {, j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& U# H( ]5 q3 S9 q: C
unsigned int count_copy = 0;9 K. J8 o; h9 B5 R
1 j: Z; E. B8 n& _ X+ W0 t: Q$ T9 p) N2 g! i( ?
int main()% `! n* h4 r* R- s
{, q+ l1 X0 n0 t
pRX_MSG_PROTOCOL pshreRAM = NULL;1 W' ^& K+ U+ |1 i z6 K6 x
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 { l4 ?" b3 c/ n% ?
6 v4 C; H. W9 e# ] while(1)
; S: _' g. w0 P4 p7 o- G {
S7 Q( s: i4 D3 `3 O- ^. T: G read_MSG_buffer(pshreRAM);3 f: m2 ?- q, D7 \
} 8 {6 r/ |6 c S& e
}" A; _' l8 R" _( T
) @# s: [" k% D: p9 _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 y- x: U, @# Z
{* n7 `* v) k9 J* R. j
RX_MSG_PROTOCOL buf;: _8 H% B V2 f0 Z" f F
! I. W- ?6 a1 t2 j, x6 p) \
buf.a = pshreRAM->a;
5 s, g0 Q5 l! ^4 \ buf.b = pshreRAM->b;
, J) P+ s F3 ~. D2 L buf.packet_cout = pshreRAM->packet_cout;
8 |& L0 l: S- ^0 r# Z, A & W) z" u) T2 B" s2 s+ R
if(buf.packet_cout != count_copy)% k" |# C/ p6 c7 o! ]
{3 R' A# N% F- K8 x1 J5 J+ T" q
printf("a is %d\n", buf.a);5 F* b3 a$ J0 ~( J9 O
printf("b is %d\n", buf.b);' f c) P4 u" }
printf("count is %d\n", buf.packet_cout);
: D8 ^ v! {* G0 a6 ~7 v count_copy = buf.packet_cout;4 r/ q. P/ }2 u
}
: A0 i8 y& _0 B else
( I$ p0 @# k, m! P% Z; k+ p {
, d$ p- x) A1 P- K( i, j' ~ printf("No effective message!");
/ g9 B+ T# F$ Z' i! F }
( v$ y/ A# y! _2 D' v3 i0 R% ~) D: Y}$ o+ y B7 A/ O( P. Z! d
+ V1 s1 a8 ]) \$ f/ z2 Y1 d5 |& P
7 m7 O( e1 A; s$ E1 p6 j8 s9 z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ ^. n& s' z% O4 s/ i' X6 W
使用下面代码,对内存使用了mmap函数后:
! L7 X4 Q {& k* n2 L0 T#include <stdio.h># }- Q: [1 B* ~. J
#include <unistd.h>- B2 v: L/ f; d( F/ ?
#include <sys/mman.h>
. ^* J/ c9 Y3 J6 ~) {. G) D#include <sys/types.h>
# E3 Q( A q) i#include <fcntl.h>. ?9 o- z$ p; |- }: ~' w
2 [: @9 ^6 j5 H$ B( w#define SHAER_RAM_BASE_ADDR (0x80000000)
. V; A3 c0 k# ]/ P! A#define SHAER_RAM_SIZE (0x20000)
5 [/ x) t0 u/ B
' O6 B" W4 X/ w* }% V: stypedef struct
' T; ~5 T7 e7 S9 }{
- q4 m! J: A8 ^ A1 f, s unsigned int a;
# ?" o7 ^8 z) L9 \8 a unsigned int b;$ a9 ]1 z. Q* I7 x, W( o
unsigned int packet_cout;9 a; t' ?3 [1 l; h2 y8 N; B2 X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- w& s/ Y% j: }5 c0 S% l' N Y- e4 ^* }7 _ h! p, z
void read_MSG_buffer(int *baseaddr);
: I" W: X3 \0 W& ^unsigned int count_copy = 0;+ T/ |7 |0 R; h7 T/ `' o; U
- }/ t& [# _9 E' u* C, iint main()
9 r E2 m0 w# q" }, f0 c6 W6 x: I{5 i$ o2 H! y4 a+ @
int fd;7 Q; o( r* S6 h
int *mem = NULL;
- J* z: Y2 K* Y P2 g: C
5 q- n2 f7 z8 _0 U \" f; r( c; f. Y if((fd = open("/dev/mem", O_RDWR)) <0)1 F# D! H" w$ J+ W* e" {
{
" ~ _$ B) D9 s( T) Z% M: |! C+ R perror("open error");
" e, P$ `. c1 H* u2 a return -1;
+ ]- z( ?3 m, d- X% Q( K" `# Q }
, Q$ n4 }1 ~" r : ^, E, p- ]6 J- Q6 ]. M
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);4 _0 p+ h" N- i8 q
- z4 e# O0 t f4 p( p5 q) H+ t while(1)& q7 J0 a# r4 U7 W$ L
{
9 `' a8 d5 r( E$ P8 I; y; y! u8 ~ read_MSG_buffer(mem);
/ q& c/ Z3 H! a7 P% p } ; I3 y, b0 L6 B4 z+ Y* H0 L
}7 v2 |6 r% x. O
& u! A7 |% c8 I+ W+ Q
void read_MSG_buffer(int *baseaddr)
7 ~0 I& @( E6 W: \7 [9 H{
) t, x8 a. B4 W( w' Q/ Y pRX_MSG_PROTOCOL pshreRAM = NULL;/ E8 Z+ S5 h5 l+ o
, s6 e# Y- v$ B) A. f; B4 x
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' ?2 P X, O) P2 _% {2 h5 ~9 Y/ a% d' A
if(pshreRAM->packet_cout != count_copy)
2 r$ Z: `1 ^, H- k# ]+ i {' B8 c; O7 |. z4 @+ \ ~; j
printf("a is %d\n", pshreRAM->a);
; q% L. O5 w6 l, X! [ printf("b is %d\n", pshreRAM->b);
$ Z3 w/ U% L, ~: E1 p! _ printf("count is %d\n", pshreRAM->packet_cout);
- p1 A: Q) s: R5 P, E/ O count_copy = pshreRAM->packet_cout;
/ {4 R3 p; s# X0 O' k }
# X4 A$ U/ f. } else& f9 A9 L+ _% M4 Z
{% m9 h6 j; N: L, H( N/ _+ i' K7 r
printf("No effective message!\n");
- ^& [0 I2 s5 h; T- `4 z5 i }
- V2 N8 f, c3 t7 ~}
4 L) o) m. s( b9 D$ Z& w) c) v; h/ k& f6 U. I- z9 |/ e
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. h( f9 @2 z4 f) ^- f5 `: _7 f9 B! ^& k
2 ?. [7 w. @5 J7 J- f3 x3 ?# x5 b0 X
1 X- O) A" h) h; s' B
9 n& d3 T5 j) r% d" T2 { |
|