|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
$ b- w# S0 R2 x" ]7 K
* X& w3 J# D, v1 SOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' M9 ]7 |) k" l' u
#include <unistd.h>! i- c( L L+ ^3 U
#include <sys/mman.h>
, X2 l5 Z+ H4 w$ d5 A) j) r#include <sys/types.h>2 y$ {( b) k9 G9 @9 S' {6 @+ ?$ m
#include <fcntl.h>
* \$ G2 c" {% }+ H& {7 I6 H% d
: o* T. {6 o" l3 D/ u* E1 U#define SHAER_RAM_BASE_ADDR (0x80000000) * Y& o- ?( P1 g; e, n; _: P) ^
7 J8 ^; j$ D" x7 s2 i- D5 Ytypedef struct
2 A) F. v6 Q) h7 |8 p: }{
) ?6 B; Y3 f' d- s. _2 @" `, w2 h unsigned int a;" _$ |8 [$ y( K3 B( D
unsigned int b;
9 W7 b2 d! N; T7 E unsigned int packet_cout;
+ j& } y& \4 }1 M- P9 T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ m: p6 d h! T' A/ v0 x
6 K1 V! \; d9 `# J+ s7 m* W( ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 C, u5 ]# x1 W4 k b: p& S: F4 t. t
unsigned int count_copy = 0;
5 B$ S. K/ O3 J$ D& `) g6 }! ~% {% f( Y- O3 p
4 Q" [ @ _ eint main()
! a( S; B2 H# {9 E{7 m' `8 T2 z- ?
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 \: \; v B4 z# C" n$ U3 U pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; K _ I1 p- b1 c9 s0 I
* _; T, L% i$ F* I while(1)& S3 x0 [/ q Q* O/ f
{
! r$ U) b" V9 R. Q" i L( s$ g read_MSG_buffer(pshreRAM);
3 U6 R2 N) m' w8 g } & L* Z4 `0 C( ]0 u! j1 M4 ^0 J) X2 U# B
}5 q: L/ M. t2 S* Z! h @
3 S* h* l1 B' e' O1 ^& {1 J( o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 n5 L `- u4 ~. `) [6 k+ S- ]) L{+ a0 ?" Y! n+ Z ^4 e. L3 \( V
RX_MSG_PROTOCOL buf;! F! \( J! e# q# ^% t" V
! ^3 d5 y6 S1 p" F* g buf.a = pshreRAM->a;& o- x6 J$ B6 M$ P) k
buf.b = pshreRAM->b;
- N0 q( d3 M3 r: r- U& a buf.packet_cout = pshreRAM->packet_cout;: O5 }4 w* r$ T' B
8 t" O2 H1 p) W9 ^, l
if(buf.packet_cout != count_copy); f! d) p6 W! ?$ j
{
, C4 H3 I: S8 B. g$ H t printf("a is %d\n", buf.a);
+ U6 L; q$ n' G0 o) \$ h printf("b is %d\n", buf.b);# y" {+ O& _; f
printf("count is %d\n", buf.packet_cout);
) Z$ t# ~' k: H) P7 z% A3 m count_copy = buf.packet_cout;
3 f% v Y4 J8 h% e2 Q' c }# E4 k6 v9 f( ~ J
else+ p+ n) ~$ a! q4 H) T: [" I
{
9 S5 B) i9 R% u0 d0 C. T; c printf("No effective message!");
3 G# l4 L) a/ c9 \, W$ w$ K# w }/ d( q9 z* p% I1 }' [6 S: h
}& |- i" d+ g: Q0 O0 F1 g
# u! N% O" F' t: F7 x+ J, X
) @% r2 u2 ~' v/ H: K; `. ?( a
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, V/ x3 ^' g3 a& `) k" j5 l使用下面代码,对内存使用了mmap函数后:
. @' D0 I) r& \6 Y. P- f3 [* \#include <stdio.h>
/ j, N A6 Q% ? p#include <unistd.h>4 \8 w, ^ Y7 }7 D* ~- O% ^) S4 \
#include <sys/mman.h>+ k1 v% V' }' d5 l& Z9 @
#include <sys/types.h>
$ Q$ e! E! Y9 f m1 h3 ]" g+ u* O0 p#include <fcntl.h>! `1 D, C) @% Y" {) [5 S4 G# v; h( e' z
6 r/ U) a: H& j3 }#define SHAER_RAM_BASE_ADDR (0x80000000)
$ _7 f. M3 g# W# x+ G2 F' l# I#define SHAER_RAM_SIZE (0x20000)
7 W/ d7 ?5 w/ ~ Y) e5 i, Z. F4 J$ {' h$ Z- m( D
typedef struct5 J, q3 _0 x- a5 ?; ~
{
# @) ^9 z5 y) o( H5 u; P unsigned int a;
" k& b7 S% h" U# k7 E$ x5 i0 O2 l2 V unsigned int b;# {$ W1 F. y* `4 J
unsigned int packet_cout;! e. w& d! x% R* d% ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 A, `- a( f4 {9 k0 l1 X7 |+ D
: ^) U4 X4 N( {+ S" d5 {9 T" \void read_MSG_buffer(int *baseaddr);
" |' Q: p. A! C* t1 W5 D5 {unsigned int count_copy = 0;/ m& A1 Z# x0 W H% l
' c; \! s2 `* U9 a1 S* Bint main()
# F' F& G) Y3 k; ~3 F3 k{* O$ _3 }* @8 B
int fd;
2 U7 m; ^7 R5 {$ ?' U' a6 O int *mem = NULL;
7 {: a3 S8 w( K, n- ~
( M. s. h/ O3 U if((fd = open("/dev/mem", O_RDWR)) <0)
2 o* l- G2 V! d" s: ~) C+ x {
' U) V, L0 T2 s perror("open error");( T" U2 ^6 i* x8 X$ d9 B
return -1;0 H. {/ f3 s l: a" [
}/ \* }* ]. `5 D( y) y
' ^# ~. C7 y0 m5 m: d mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 ^4 X/ Q* W9 U( J
- d7 n+ r5 ?- _+ A while(1)$ X9 Z1 @# B+ r# X, j% |" R# Q
{7 p0 X" q1 _1 Q2 }) R! ]
read_MSG_buffer(mem);
4 r9 T& f3 z4 C7 a3 D% B6 @ }
t( d5 G9 o _, m3 p- X8 b Y}
8 H, J3 {; ?+ ]6 k2 q" V! P; o2 L& o1 W8 X- @
void read_MSG_buffer(int *baseaddr)7 Y. m8 k8 E# M+ l
{
8 O7 |" f- N! } T8 z4 p( a( M pRX_MSG_PROTOCOL pshreRAM = NULL;
+ E6 y/ b+ S6 u
- a1 o ?; K2 i% q' P pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' p( O' Q6 Q K( C( o
! L0 d. q" g3 I5 C. _) Z1 Y% @, W if(pshreRAM->packet_cout != count_copy): l/ T* X' G8 `* @$ d- P& N
{( c8 }1 H7 J1 ^ O2 z( [% p
printf("a is %d\n", pshreRAM->a);2 O. X9 j b E/ k
printf("b is %d\n", pshreRAM->b);
/ y' }: G* c. K x9 c; U* D5 X printf("count is %d\n", pshreRAM->packet_cout);+ A: p% k) B& W. I$ Q- J
count_copy = pshreRAM->packet_cout;
# f( \% F( z( M A( Q }
8 ~( t, g1 H# s. F8 t; v else
* x( `/ q- N0 m7 i: c( ^5 u/ T {& D% S; I' k& K; ]8 d& P% R; t
printf("No effective message!\n");
2 o$ H5 a. r0 n3 W }) ~/ `+ ~& m1 F$ x# S: m2 {
}
. f" G" k# l6 [# k, t% \! o( q8 c9 T
- `4 ]0 e. r8 T. [没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ U) U! q* N/ C, ^
" p' b2 V1 F2 [ y; j4 E
* `3 d) N, o& N+ @1 Z- h5 H; k' X7 W# x
' Q* b! t% b& j: \1 t( B3 l |
|