|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( M" f; v: h3 u2 ]' `3 v7 q/ P2 b# p
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% e2 H% j( g% u* N( Z4 X; v
#include <unistd.h>
0 C6 _: d% w {3 u6 F#include <sys/mman.h>) l1 l D6 ` k( q3 a6 s' f
#include <sys/types.h>
' G- `( A C5 S( `0 g1 t W#include <fcntl.h>
- H6 E8 @. A3 v. j3 U& Y" k; w
]( ?% T. W- a0 m) R9 c* }#define SHAER_RAM_BASE_ADDR (0x80000000) # A: o9 w( e2 y, h+ S
7 ?' j6 O9 \4 O" t8 t2 r6 ^& s
typedef struct
3 _7 h. M) F" _$ D9 ~9 H; k7 U{
! d+ w$ |/ P$ J: A; Y P& v unsigned int a;
' o$ X3 K1 A1 V) A* m+ G& c& l' @ unsigned int b;
! |+ A( D6 R7 g. D: n* V unsigned int packet_cout;
+ v5 U# v$ A: Y- Z5 ^+ T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ ~- A- U7 |7 R% L# T' F0 j$ b
) {. g. x$ c7 l6 f) L# Svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 P1 V" }$ |+ v$ y/ `: ]* punsigned int count_copy = 0;) F) a/ p$ ~9 q1 ^3 D
r7 k, I% R% I. @! k, \
3 v$ ]/ ?0 Q$ K. V8 J" I4 Uint main()
/ _3 s0 _- G7 S* a `5 j. t{/ [' Q) ^" S) T
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 e, k2 N7 m1 O$ R! d pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# k7 t8 Z' O) h5 n; l& h
0 D' M; G# a7 K) {) o( F" c while(1)* z7 \- H6 k& m- l9 h6 d; ?
{
p# f2 s) Q2 S3 b0 O read_MSG_buffer(pshreRAM);" M* d& ^# ]+ a' s& a
} ! f3 ]4 L! c; C) X
}
6 g2 A. x! A- I2 L5 z# Y6 V
$ a# U- S$ c: }- O5 Z; y* E) [$ evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 }8 }: A3 |7 `& K2 y
{
% T+ D7 w8 W$ c [6 F) ]# { RX_MSG_PROTOCOL buf;# P, D; R% N. l1 `
/ a/ S- q' x% w; e, h3 m buf.a = pshreRAM->a;
- O& H$ a1 W2 A8 M* P( x- M4 h8 z buf.b = pshreRAM->b;
& j& }- y( o& Q: g u1 R buf.packet_cout = pshreRAM->packet_cout;
1 A- `- u* Q/ L3 I9 X q ( i& I5 ^. |" w9 Y- G6 v1 m. H
if(buf.packet_cout != count_copy)4 A* n' T; d; l, M- [
{
, p$ v3 ~: V1 E% F, m printf("a is %d\n", buf.a);- n% S: T: F9 a6 C9 G
printf("b is %d\n", buf.b);0 n" i2 @( p* N- z( |2 @
printf("count is %d\n", buf.packet_cout); g, x7 \# N ^' i
count_copy = buf.packet_cout;% O3 a: l& w4 n. m
}
) h9 j( h+ z4 [$ p+ U else
7 T/ t! p8 K8 H- Z4 e" j# ? {3 c" O/ b; H+ V7 D( L2 n' m
printf("No effective message!");) k: O6 z% p8 L9 f- x- g
}
W) {! @7 P- q}! S& X5 p9 h0 S7 X8 E' W
4 a1 U+ y9 [9 m% j2 }; i+ e
- [" Q( {2 X; H( _5 o9 z8 K B1 i
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 W) d# M' s# I使用下面代码,对内存使用了mmap函数后:$ {% l9 O/ c9 j: N$ ^5 Q
#include <stdio.h>
7 P3 N' u/ z0 O6 @4 p9 ^2 q3 X#include <unistd.h>
, L/ N2 e/ {( H$ N1 j; ]# `#include <sys/mman.h>& a4 n7 ~7 ^: ]0 T4 ]
#include <sys/types.h>
0 [2 n. c8 b5 e8 \3 \3 a#include <fcntl.h>
4 G, p. H" |8 R2 I
! k) h5 `. p, @1 g+ c#define SHAER_RAM_BASE_ADDR (0x80000000)
* Y4 G# q$ I! H* X6 F6 s6 X#define SHAER_RAM_SIZE (0x20000) 6 o1 O4 X( u: i G# Y& n
+ `+ e) W5 I5 J) W0 n
typedef struct
) P! N5 Y% e& n8 `9 N$ o3 o{
$ _" _! R E; z- H, o unsigned int a;
- j9 k1 H: m# z/ g7 M2 q unsigned int b;0 h; [& f2 |2 b6 M, D0 p
unsigned int packet_cout;$ M" L) j: s W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; `6 I. a8 ^- Z; u l- I# R4 n; I3 K
void read_MSG_buffer(int *baseaddr);6 {9 O# K* }, s% z7 F" l
unsigned int count_copy = 0;; q ~0 D! R0 L0 p; \% ?$ Y g
- o1 W0 P( W5 I# v! j! L- ]int main()/ _8 A+ t8 P. C
{
' }6 o% w+ f8 s8 w int fd;: W/ a) P5 z( P* U( q; N& T$ E
int *mem = NULL;
7 c7 p$ y, n) {0 N& Z" b
! C& a# S) h# r8 d" x, O if((fd = open("/dev/mem", O_RDWR)) <0)
- d X0 E, q* O. z; W% N- B {, Q _5 j. w6 Q
perror("open error");
6 f0 t2 Z- }( J. y1 ?& K return -1;; m7 y; q4 V8 y
}
. Z7 Z, N+ [7 I' T
1 ` e; ` X9 H/ ]0 m+ m) ~ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
m" O9 B+ U# g1 M' w, J2 r6 K' U
while(1)
) u' c1 M; F ~$ E2 k: h9 C& v+ S {1 B& ~- {4 B& b4 |9 b! r
read_MSG_buffer(mem);) A7 H7 E, L. F) T$ Q2 l; v
}
& ?( H5 ~4 M( W6 K. T6 ?6 j5 O}. @4 L5 F' u9 W8 S1 g6 K" E+ O2 g
& v( Y, B1 o q' Y* Vvoid read_MSG_buffer(int *baseaddr)
; }8 H& @- e- b+ h8 g2 ]{& f9 k" P0 G7 M) u6 L( ]* @% v+ p
pRX_MSG_PROTOCOL pshreRAM = NULL;1 V$ q& O9 |; R: r6 ~
) \2 u% l z/ ? O4 {4 M( Y# q
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" U9 B& i Q2 V S9 O1 U1 V p5 C$ \8 C2 ]4 \. N7 n9 T% z
if(pshreRAM->packet_cout != count_copy)/ S6 e1 N u% C
{: n! Q( f) N. w n. M' ^4 \) W
printf("a is %d\n", pshreRAM->a);
) o' T, H' g# h printf("b is %d\n", pshreRAM->b);
" K/ c# _. ? `/ T printf("count is %d\n", pshreRAM->packet_cout);: v. t( H- a+ b1 X
count_copy = pshreRAM->packet_cout;2 D9 n( q7 G$ I/ x: E
}3 O' @- Q1 ~1 n0 z: \0 j( x3 \
else
! i, Y2 W' Q: f6 V) w {9 S) G" }& r2 ]/ F0 d# d& |7 M
printf("No effective message!\n");# c+ Y4 B8 d2 f. D
}
& o$ \( z+ |8 ] r* g) i0 x}& y0 M' a1 O9 G4 k. e, s
5 F; E) g; s9 O3 Q3 c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 u9 m$ ?+ c, r( O* W/ s$ r: F6 d8 ~% ~( |8 U
5 k' E0 r3 S+ V: @3 ^7 t3 q) K+ U+ ]( \& ~$ V' f( _# F
- i3 B( ?' _4 f* N. R
|
|