|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 x: ?0 b5 G! P; }! f, d
& Y/ R0 O. k1 h$ D8 e! j5 F' x
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; A. a" f, j a3 U
#include <unistd.h>
& M) q& R: r4 j) x#include <sys/mman.h>, |! D1 B6 u, b+ y
#include <sys/types.h>8 `) D8 S9 @% U8 f' I; N! R$ ?
#include <fcntl.h>& K6 @2 q1 \8 G7 ~
7 L U) r* v6 g0 l#define SHAER_RAM_BASE_ADDR (0x80000000) ( Y! |3 r6 K& U/ B6 X* u
0 l6 L: L0 x x- g
typedef struct2 _ }: s) P- [% ~' R0 g
{
% ^- f& R. }- T2 T [) U0 _ unsigned int a;1 B+ _$ ~' y- k, A+ J2 I5 ]
unsigned int b;2 e) K% |5 Z1 X# T2 N) C) J, v' B
unsigned int packet_cout;
) P8 c! b- f, I6 G" Z! }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 |# P F. u' K# [- k; w' ~
+ d1 F; `" {$ dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' f5 [' x- G5 C" \0 f1 Sunsigned int count_copy = 0;
. n: F. i6 q( @' F8 G9 c$ T
2 |3 g2 c, O% e V8 g6 M2 Q, ~! D6 i' n" @ u
int main()
( q- J7 P' J7 L2 P; C{. t/ g" Z! S' I X6 r
pRX_MSG_PROTOCOL pshreRAM = NULL;. W, T! E; b. N# N4 u5 R! e- A
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, X' M# G% O# _0 N& G J( ]. C( K& L
while(1), |( u! @. e' a6 l/ q
{
0 W2 r9 v' L; j6 V: v% z2 p read_MSG_buffer(pshreRAM);8 J: H2 R( ^2 i' R, a' D# @& n2 ?
}
8 ]# L9 J: |0 F# L1 |: v4 T}
; l/ [0 ~- F. y5 o1 B# | _8 \
7 |2 Z* s# R0 l1 n+ V! zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 i. u' d& B" P6 `{
0 |# {7 m3 }' U$ y, s. e- q. } RX_MSG_PROTOCOL buf;: O- R! w& \8 Y9 |0 [
" y2 T- u( \. y* n
buf.a = pshreRAM->a;
3 N! F' P H- u- g buf.b = pshreRAM->b;
5 v6 ? V( p1 o2 k buf.packet_cout = pshreRAM->packet_cout;
3 N/ B& h" L( u9 g8 R/ t# `
8 _) B& i$ n4 B# b if(buf.packet_cout != count_copy)
6 _' d' }( }7 Y% i5 O+ ^ {% Z5 I2 z5 c; e# o6 [7 k
printf("a is %d\n", buf.a);
7 ~: H, o# g7 @' a$ r printf("b is %d\n", buf.b);
" q+ K; m- g/ i1 Y( [ printf("count is %d\n", buf.packet_cout);: I4 h4 V9 c4 X$ J# d& D1 t& h+ X
count_copy = buf.packet_cout;$ P& P, O0 H( h! D E/ g# l6 W" O
}
, u# p3 r7 R' L" x9 G else
- [+ @% j. L1 M9 ?: \$ x7 w {
- v; P# i. m2 ]$ E" y# P3 ` printf("No effective message!");0 C* j. }2 f4 e2 `5 D7 B0 o8 G$ l
}6 ]# m6 d4 c7 \1 p! p' \! ~: Z
}
' _4 ~1 y9 p- a7 p @
' t6 P+ _$ t0 W2 a8 q) V
; q* o/ C0 V0 t! @+ D; K( O# L但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 [# U( R' s. m! I7 t使用下面代码,对内存使用了mmap函数后:
2 v* O5 Y: y2 Q& S' T#include <stdio.h>3 t$ N1 H0 b. g2 L# e3 U
#include <unistd.h>
}# s1 g" c/ V& p* b#include <sys/mman.h># f" q# R% q5 ^1 D p9 k
#include <sys/types.h>8 v+ S+ a$ f+ |* o" h) w
#include <fcntl.h>, L: @' o" P$ d0 L7 p- O" F4 D
: d! `9 o+ Y' z7 {: x& Z% D0 q
#define SHAER_RAM_BASE_ADDR (0x80000000)1 E: l- b0 I8 t: M" B& Z1 x: S$ U
#define SHAER_RAM_SIZE (0x20000) ! B# U& Z; X$ l
0 u1 [3 i* {6 C* g3 H2 V3 g b4 ?typedef struct
, W0 c2 c6 `+ e{
/ f" G" M- \2 g- O9 r8 ^ unsigned int a;. M: Q Y4 p. i ?' Q* ?: F
unsigned int b;6 g3 j& [* }# G7 ?" b0 P
unsigned int packet_cout;
5 H. T: i4 J0 K9 _, F/ @3 ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* y+ n- I4 t/ H8 ]' \' J1 \% r+ {9 }7 q
6 O3 x2 F( {7 f
void read_MSG_buffer(int *baseaddr);, n6 A% g" X+ F1 c
unsigned int count_copy = 0;& e7 W6 f0 w5 Z$ L* C) j' _! G# x
' \( o1 D8 i3 z" N( W) M, X
int main()- X! X, m; u7 f& h
{
- A* m; H a* \: @# @ int fd;; f t3 t) m: N9 G
int *mem = NULL;
1 t5 r% d; c/ N: }
# D: c2 \ j; m2 d if((fd = open("/dev/mem", O_RDWR)) <0)
1 }9 T* Y- O3 t. }. @8 I {
" V) [, |# `0 D9 n, j/ S! j perror("open error");# U1 q" o: @5 t. {7 V5 _
return -1;
( J j( \& B Q# d! A( |; k( C9 a }1 ^; ^( N! a7 A) P3 Y7 y, g% b
2 X6 N$ p* x' o. M/ o6 f mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' v1 V& o5 z6 K. U) D+ z
o0 X0 k' R- W; S while(1)
( P5 m* t0 u6 Z; v! w/ b {. r2 @, |7 `6 i9 j
read_MSG_buffer(mem);' V" U# h/ k+ A7 m/ c2 u* `7 G( A5 t
} % h! w" Y5 m! P7 Z' h" \$ p
}. J* A4 W1 w" D& K% H' {
8 f& f: q9 f# W, t. ^0 R; j- ^, V
void read_MSG_buffer(int *baseaddr): C# ^; r9 I/ w3 @
{
4 K$ k! |8 S. y: N' D/ b4 D pRX_MSG_PROTOCOL pshreRAM = NULL;
8 c" A5 ?9 C$ |# q
/ w4 ]# K7 C3 j4 H6 \7 @- I pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;3 }8 x" p4 L) S9 V! `1 f& Q4 b
- T0 o# q, m9 B3 }3 b/ w* z if(pshreRAM->packet_cout != count_copy)
, r- I3 N4 P1 I: D9 m0 z- l {
* ^/ t) W& v0 H' ^ printf("a is %d\n", pshreRAM->a);% @# Q3 Y: ]7 Q4 l) W0 Y
printf("b is %d\n", pshreRAM->b);% F4 a" O8 s* m; u
printf("count is %d\n", pshreRAM->packet_cout);
% S5 A5 k w1 L0 d count_copy = pshreRAM->packet_cout;( @0 y C0 c) V$ V. l
}
$ g- ^/ _1 [. w8 }. N else J: U0 Q+ l7 w6 \7 X' K
{
$ g( o6 k$ v8 C printf("No effective message!\n");# ~3 X5 s6 V1 w2 S, n% w
}
/ y4 O7 g5 q; D# o}* ^7 c1 u' D2 p( L
9 c+ y6 p3 V, X+ _- k9 X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! t7 C8 X( n: w) x! r
" B) H P- ?. a/ y
3 _+ ~( P. f2 U. @1 V4 T' U
4 o; S- Z" ~+ b% q1 o) H$ N! S1 L/ p8 W# h9 y
|
|