|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / v3 S/ z1 _& t1 [
1 f1 R& L% V% W' u9 E4 cOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- P6 v3 J9 r( b) ?8 x" A
#include <unistd.h>
( B5 `7 X: I; q#include <sys/mman.h>
: ?) X$ C c0 u. A* i9 ^4 g4 R#include <sys/types.h>: u4 g" R& K* l5 z. m# o8 d0 _
#include <fcntl.h>
$ b- T& [. \9 A- b$ y7 N! G W7 k0 d- {1 f) \% {" e
#define SHAER_RAM_BASE_ADDR (0x80000000)
# {7 {; l; P% k
5 v" b. |% s; {0 ]/ {typedef struct
4 k6 P/ |6 L2 r+ K4 l/ x0 y. Q* L{
: F1 H+ ?* C2 W6 t unsigned int a;
6 _# t U/ |3 _* p# i/ e unsigned int b;; @; ~( G2 e4 q c* _6 a+ r
unsigned int packet_cout;3 k8 W5 [. [7 h0 L; Q n# @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ y! |$ }7 d6 u7 Y3 F
1 B5 A5 y" g& \/ i i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 B8 h) W% ?# wunsigned int count_copy = 0;( j& [" v/ Q* F" I" J0 C9 R4 {
5 f4 _! E) R" O& |% g! A! F+ h/ I6 C9 C# H: i$ T" {5 b9 J! ?0 d
int main()9 H% \& d& Q* U! h. g# w# S: S0 w
{, N+ }/ b& l( V& N v v
pRX_MSG_PROTOCOL pshreRAM = NULL; b3 D5 H# M. b2 Z N5 l" k
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! N% k) f) f) {% T0 M+ G' z- y' I; i8 ]. l9 |) B b/ C
while(1)% E5 p6 m7 T$ G& V( n
{- d6 N8 |1 j; F8 L, r* D2 V
read_MSG_buffer(pshreRAM);" f7 q- Z. r0 L' e* r
} , @. Y: ]8 h9 A1 ?
}2 Q' g" ~5 U; j, O! v
: X5 f) E7 X2 G/ Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. V' A# [' Y- F1 c6 o1 w{$ g* a6 d* O( l; G- L
RX_MSG_PROTOCOL buf;
3 }6 M, z3 m$ P) L. O( @) w. G 3 z7 c, c- d4 ?4 D* S
buf.a = pshreRAM->a;7 U L* x+ e8 M
buf.b = pshreRAM->b;
% i/ U# k% I5 D( X+ o buf.packet_cout = pshreRAM->packet_cout;
! D( V$ @- e! h) ~1 l
- o. p" y% G5 n# m* S5 C5 }! r! B& v if(buf.packet_cout != count_copy)
- Z' B! L7 l8 v# Q9 d: Q {
0 b% |& ]- Y$ F printf("a is %d\n", buf.a);# z \0 b0 G+ V% W
printf("b is %d\n", buf.b);* g$ Z5 b- ?+ T( }6 s& g' i: S
printf("count is %d\n", buf.packet_cout);
" @1 L' P; t2 Y) _2 j count_copy = buf.packet_cout;
: }9 ]% o8 @; O4 c7 y- a }1 ` H, \2 O$ V- V/ ?, t
else
6 e8 Z2 A: \3 W6 T& V) ] {
2 @ d6 m' s$ p printf("No effective message!");
; Y; r; J7 C6 } }% n j$ T0 O5 u/ g
}
: S( ~/ c: c3 I# g# G" J% t. z3 d6 x% F2 A6 Q/ G
+ R8 L0 R$ L7 `# b M% b) `# y' O! X但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! N0 B: c k! Z- |使用下面代码,对内存使用了mmap函数后:
( N0 i- K! A8 _; B( Q#include <stdio.h>. ~9 W" [7 ?" p2 T5 p; ]. @7 s
#include <unistd.h>
* Q) e6 z z, z8 _' z8 D4 R: Z# X#include <sys/mman.h>0 { H0 {1 h$ u* ^* I" y
#include <sys/types.h>
4 F. l8 ?0 y3 V/ p9 I: y+ u) a#include <fcntl.h>7 V' M+ }* G$ R8 P" g, d4 s
3 a' w: _9 B/ e6 A0 d#define SHAER_RAM_BASE_ADDR (0x80000000)
( t& Q- E i8 c8 j0 |$ P#define SHAER_RAM_SIZE (0x20000) + ~2 f( l, k5 @$ x! M- Y# R
/ K5 z9 B1 D2 D) Y* ztypedef struct1 w! ] c( V- ^ }2 z+ `
{
( ?0 n3 ~' z, Z1 r% Y3 m9 v/ N. v unsigned int a;" a. h3 R9 T% x) t7 o
unsigned int b;
- |5 r) B2 d, @+ v unsigned int packet_cout;
- D* P2 P9 C8 X- S, p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. c; e1 i) t1 A
6 {2 L& p5 H) h
void read_MSG_buffer(int *baseaddr);
+ M* W& E. \5 C( Q7 Ounsigned int count_copy = 0;
1 W- s. a$ E- Z+ P4 a
+ e& _2 y% \! N* P5 [' iint main()" J2 i- E0 O1 p; M- U
{
9 e2 r1 E% U5 c int fd;, O+ K; p8 h2 N. O" K/ R) y
int *mem = NULL;! u0 i g4 r/ `4 C; G
. V2 k- }% U% o7 K
if((fd = open("/dev/mem", O_RDWR)) <0)3 Z' ^8 G) u G' c D
{
6 o% w* Z" x+ W1 _* t" q4 d perror("open error");6 S5 |$ }* H z1 ^' n3 u6 [# X
return -1;' I" k+ a( d3 f+ h
}
z! ?, E) o) Z
8 [5 @. s: s% w* x mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ \$ e- C5 g' P4 V
4 a# S" {, t& \# M1 [+ A. q
while(1)
+ K/ s V6 C+ B+ G% O. o {7 I0 u( m* z3 s$ o1 s5 [
read_MSG_buffer(mem);
+ n7 Z+ n1 d9 H% D }
8 ^5 i8 ]' q3 {) N6 e}
! U% p- d$ s$ C: X1 x3 S; e
# ^) E$ v. h. ^0 T Nvoid read_MSG_buffer(int *baseaddr)" v# W" p$ {1 _4 T
{
7 [! C9 \) T- C9 v$ T- D5 P pRX_MSG_PROTOCOL pshreRAM = NULL;
& X# a) X0 [0 s {# H6 C5 n4 \; N" O3 N! J( S
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: y- l. Z; r" D5 z. q2 Q
. t O) [/ a- c7 s4 h# l
if(pshreRAM->packet_cout != count_copy)
4 p2 B8 m0 v; s } {
2 C/ p# @# \- ~$ P/ N printf("a is %d\n", pshreRAM->a);. y" q, e. e4 [! d/ N5 i
printf("b is %d\n", pshreRAM->b);# [6 J o! I5 r8 J ?. o. F7 i$ t+ b P
printf("count is %d\n", pshreRAM->packet_cout);
+ }$ m7 A& M* r' v1 \9 J7 z count_copy = pshreRAM->packet_cout;9 K6 V( z: ? W# n0 F, f# h- l
}
1 N& W# M6 Y. T, F$ C8 x else
6 O8 h/ y/ L/ r& S( x1 J1 M+ V0 H/ O {
! g5 o/ F3 `$ x. S printf("No effective message!\n");* m# k+ f4 ~# G. S- O
}; H0 S3 j5 c8 I6 ^) B% ~& W
}
* q% q" d* e" o5 f3 p0 A; ~( H C; G; Y9 B
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, Q# y# o' N/ K
9 i. M% X+ ~! H7 R" @; I. M$ H( |- n1 H: q
( ?- M/ r, t8 G, W+ H
6 [6 h5 k! z% x6 c) w7 N% l# L |
|