|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 i% ?1 L: ~' e2 _
( S" [5 G$ r, J& V9 H3 `1 sOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
F% _. `5 }$ W* K% Q#include <unistd.h>
6 Y# {) i. T) |. ^$ z* P#include <sys/mman.h>
/ H* v( b$ ]% n" g! E: H$ }6 M2 f3 ^#include <sys/types.h>
/ h/ q/ |. C3 C. N6 F#include <fcntl.h>
; @) E% |0 P# s# ^0 t9 ^8 B$ h
#define SHAER_RAM_BASE_ADDR (0x80000000) * e* {0 s' G/ }5 F2 X
3 v% @# d+ O1 J4 atypedef struct) O. X; _+ l8 B! b$ H
{( ]# b, }7 N, L5 s
unsigned int a;
5 X9 y0 k* l0 N9 v% U( ? unsigned int b;7 \+ M3 l7 ~, \7 J3 _5 r' E
unsigned int packet_cout;
1 f, H; b$ F8 ]: {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; X9 Z! G6 L9 W L; I H/ Z
( l. l/ _6 R/ mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: a& n2 D' W8 w7 c" N8 R" P
unsigned int count_copy = 0;& D2 i5 x+ f, R; | a: N1 z
3 m, X8 E0 w5 h
( J6 u J0 k$ g1 A9 m" `int main(). l: L. ^+ d; u
{7 ~& t, T4 V2 O& e: R, F
pRX_MSG_PROTOCOL pshreRAM = NULL;/ b: R# _6 x7 U8 t; q1 q6 U
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* R. Q7 {2 B" y1 p
8 `* F& K" u5 A3 `3 I while(1)
, y% A% U; |& ^( X; i4 P {; s! n+ x: \ E# M4 e$ ?3 e) m
read_MSG_buffer(pshreRAM);7 O6 A2 u, O0 J5 Y
} 4 e, h" ?+ A' y& G, Q" s0 |5 I
}4 T! X. W% ^9 M( }! }* Z' V
" u4 U9 J2 P3 Q, S( E( r0 ]. E5 ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( b: {1 [, w% s K# W0 [
{
& u8 N# O( R3 O4 o9 { RX_MSG_PROTOCOL buf;& M. ~( y6 R1 E+ P0 V$ E
* d% ^6 Q2 y a. \5 ], x1 j buf.a = pshreRAM->a;; j+ b6 G' |" v" `+ b7 K
buf.b = pshreRAM->b;
e, L+ c8 Q8 |+ `- |( D4 q S. { buf.packet_cout = pshreRAM->packet_cout;
! U% k K) j, N5 E 1 V% @7 c* q3 z8 W
if(buf.packet_cout != count_copy)+ q( W( B+ h7 I8 N
{
/ O" _% y Z) k6 `; z" L3 l" z printf("a is %d\n", buf.a);
; G' p2 ~7 s+ s printf("b is %d\n", buf.b);
% h: m/ a4 N. }+ ~" H printf("count is %d\n", buf.packet_cout);
' W& Z& }- W0 ?- A1 A count_copy = buf.packet_cout;
+ R, b1 K$ G# b8 f }/ ?2 s {" k6 x7 X, m
else3 y( ~4 _' r5 M2 X
{& l& W- l, g, m. H" _0 U
printf("No effective message!");; a2 e* b" N8 T) K' a7 g' ~2 H
}
8 M+ V1 \$ V) h! a8 U0 [/ x5 x. h}6 L. ?1 Q% p# A6 I* w
) s4 |) j& [( k$ k) M' W4 Z, c; _) }' Q8 W) u7 [' R0 t
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* t" X1 t6 W; I1 O6 U使用下面代码,对内存使用了mmap函数后:
$ b0 t* M% f6 {. D f9 t( v#include <stdio.h>
) T; q+ T: R" @ @4 p9 e" V#include <unistd.h>! G P$ M0 ]# ~7 q
#include <sys/mman.h>% L' {' ?. i+ f* P
#include <sys/types.h>
, _, R2 D2 L3 N* K; t5 p2 Y#include <fcntl.h>2 W- C5 K' x, Y9 n
+ [ _: i: M3 i G/ u+ W5 i) ]
#define SHAER_RAM_BASE_ADDR (0x80000000)/ s# m- ^6 q# t
#define SHAER_RAM_SIZE (0x20000)
! z9 Y7 x# w# ~0 l, V3 j4 P7 q& o! f# M
typedef struct) @$ ^( i! C! e; P
{, \% X: e, [ d4 s$ O
unsigned int a;
( k3 d0 c6 o2 `% ~6 f& F1 n0 G+ } unsigned int b;+ D0 R* X" T; T0 A# C
unsigned int packet_cout;
% C! [, R e* I* C/ _0 f, Z) U}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. v, {$ D7 u. r0 l8 u2 V% O% ?; ~
void read_MSG_buffer(int *baseaddr);' L* O2 P# _# y! {3 a0 A( u' r$ N
unsigned int count_copy = 0;7 k! P- h% r9 i+ i- |0 w1 y" y. G
6 j" H9 X0 n' w5 sint main()
0 u G: w8 Z3 M7 s; @' I2 ~{; X% i7 I$ L9 i/ n8 _# p
int fd;0 {1 y3 i% [: X! e
int *mem = NULL;
- {6 C5 a3 g- Y0 u' @' c
9 O* K( Q% C) m6 q# E if((fd = open("/dev/mem", O_RDWR)) <0)
' m+ T+ p) `. G! X' ^4 D; D) s {
7 k( `8 G- O2 r" w1 ^ perror("open error");
8 _( a, Q9 G$ k! G2 ^6 ^5 Q return -1;
4 X+ J1 X; @ o8 v }
. T& K1 n/ B H3 f* q $ P+ ]& ^1 d1 k0 c+ u
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' l+ C+ U* c9 E0 C) |0 i$ _- W
' H5 ]) t( s, F& v3 p+ a while(1)
9 X+ @- e& q$ ~ M {9 f; m" k& e: `- q, h
read_MSG_buffer(mem);
3 i0 B+ r! u. U0 u1 \ } * r( b6 m% T( U8 L) V) ]9 _
}! N; l% j1 K* f) ^7 D k
4 O& f' [) z0 x. b. h; |6 a
void read_MSG_buffer(int *baseaddr)5 d6 O9 B% J y! l
{" ^ x* h' w& `- V2 e
pRX_MSG_PROTOCOL pshreRAM = NULL;' M# |: H* Q" ~) _- h
) l5 r6 P% |6 X7 M pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;. @4 o& W& ~" i
' V5 N# r& j" c
if(pshreRAM->packet_cout != count_copy)
& r2 O+ t& d' u& K2 j4 x" r5 c; c7 S {
: v" n$ P% k8 \ printf("a is %d\n", pshreRAM->a);
4 ]$ ?& f5 `) M& }/ b( ? printf("b is %d\n", pshreRAM->b);
" p# ~: `3 b# @- |% j- Y$ T W' N6 k printf("count is %d\n", pshreRAM->packet_cout);# V( A: q( B% R& [4 `. @
count_copy = pshreRAM->packet_cout;
. b! o0 V- B0 ~. ?+ ~; k" e) N }: W9 p3 e, a$ _0 V9 G
else, c6 a6 N# C- Z* H: D# I' ]
{* O! }& N/ U6 [; w' k8 Z
printf("No effective message!\n");3 C& c0 e& l$ Q$ W/ H
}# \- R3 B6 _+ x% X# n$ [
}6 T' ?& P' H: o& W' t
% r+ I( N4 R% b) w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' K+ ^+ _: i& Q+ L8 x. |* p
2 {8 U+ _" Z% E( k8 N; v/ V; `" R! w3 I
4 o- L2 i2 J* z7 n' B8 o0 G
6 J& _+ i: D, w: |! Q% U6 j0 p |
|