|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ; X9 i | o- x$ U3 h* W' Q& @
9 O6 H, s& E( Q* SOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
r" M }# `- ]4 V#include <unistd.h>
# s/ m7 H5 p* ~2 U4 N#include <sys/mman.h>
+ L* y; k3 P! D1 h% |* T#include <sys/types.h>
/ s, e: @+ Q$ ~8 b1 H#include <fcntl.h> Z6 Q6 y0 N! u! g9 p7 k K' u
8 x; p5 A' p F. M+ g
#define SHAER_RAM_BASE_ADDR (0x80000000) 2 s. T0 @. `6 C
$ C0 \; W( a, {3 E: _
typedef struct; J! h+ u5 s, J9 h9 U; c8 I
{# ^, Q$ }, d) Y6 A+ w* |3 w- v
unsigned int a;
7 E& |6 x4 L& c# J4 j* J4 j unsigned int b;
0 c+ I5 \* f. q* w unsigned int packet_cout;
- b5 x i! q8 ?5 Z# ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 m; I7 I& Z+ C, t+ V, @9 g6 g' Q8 J9 ^; @. |' B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); N H5 i. X' p
unsigned int count_copy = 0;
7 h- {$ Q$ P4 n( M+ N& i; t! H* @8 K1 t
" w8 a% D" A8 v9 H: y- T6 |* }int main()' X( I! j; D6 H) o1 `+ h T
{# s0 X$ Z& N4 M! d a+ j V( ?
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 b6 w2 c- k7 _ q6 Z pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;6 w9 Z. Z4 t d! y6 U
6 E$ Q1 `5 J$ V# M: \, I3 R% q) s) h
while(1)
* g9 Z" G1 f* u K/ g4 Y B3 n! B {* `# u& |0 ^: `/ B* S7 Y2 c
read_MSG_buffer(pshreRAM);9 Q* c) X) |3 b. r3 E
} 4 p$ a' _, P4 P @3 c
}
+ K* B. W9 x6 U# W! [
. c" A \7 \+ E! B. j2 [. n! Mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- I1 Q$ O7 ^" ~1 J6 p" x$ f; y9 y
{, Y# t; T, N- e! z, g- s
RX_MSG_PROTOCOL buf;
5 n& G6 A& H4 H* ?9 m4 q1 C; V O, L4 `0 ?, g+ N z' e! {
buf.a = pshreRAM->a;
$ u* |1 ]7 w. F1 c buf.b = pshreRAM->b;1 V q- U U+ e; {: B* m
buf.packet_cout = pshreRAM->packet_cout;/ S; {* v, P) \2 B2 F1 n5 J
2 t H5 N1 V# D9 p4 e# Y
if(buf.packet_cout != count_copy)
: ]+ J8 @- D: K- l& I* ]4 e$ ? {; p* ?% Q* ~3 l* d7 ~" K; U# j
printf("a is %d\n", buf.a);
6 M9 {& q: M8 ?1 }1 ?, c B6 H printf("b is %d\n", buf.b);3 Q( e" K0 P* Z4 W+ X
printf("count is %d\n", buf.packet_cout);/ c1 o: w/ G5 L; z! w
count_copy = buf.packet_cout;
6 U; D J3 d" x6 T }
9 H9 U. `* k& x3 q( T* |9 w3 u5 P else' k7 \' S# s( H- U* R6 D( w7 L- Z# l
{# x3 g( |4 S" N9 }; ^* @; R
printf("No effective message!");
, Z* [ \8 p( a }0 q8 w7 W% s& Z# c1 w3 S. n
}0 h9 K. o. w: r" ^
. _, o9 d, o+ P
; I9 t6 Y4 C2 z. t( T. i但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 e. R. y+ ^0 s+ f, j( B使用下面代码,对内存使用了mmap函数后:. t, i* K1 q2 z& P# s0 z' l
#include <stdio.h>3 l; n8 c" j4 \5 Q* L9 w: o: |
#include <unistd.h>1 U* b0 o- e; W* S
#include <sys/mman.h>
7 I5 m0 m, C! `, S#include <sys/types.h>
! J" Y4 @& K7 F/ z; Q/ F; [0 y#include <fcntl.h>
; n4 R. w4 N/ V3 I; G( A
' j- b8 n5 F; \( ^+ ^0 k) m#define SHAER_RAM_BASE_ADDR (0x80000000)
I1 `! L& R/ c' Q" \! m5 R& O. c* r#define SHAER_RAM_SIZE (0x20000) / V2 D: i: O% T5 p, L
d: B# q" A7 A' v1 Stypedef struct
& Y. P6 f! f' I{
) B! [) z/ e0 n' I- Z) c% D unsigned int a;
% F5 h- l6 ]9 v* a3 F unsigned int b;- f: `) O4 ?7 H& h; x. \4 F
unsigned int packet_cout;9 ]" f0 f: o N8 U, G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) ~$ F! g# L+ N- o
/ l' M, e0 l% ~0 H) L1 \
void read_MSG_buffer(int *baseaddr);$ w2 x& I. ^4 C* p
unsigned int count_copy = 0;0 o8 L( f" z4 v4 }. Y6 ~
% U" S" k4 w/ }% u {1 w3 x6 F- w3 T
int main()
" R& o- W G! Z. C{$ e3 b' ~# p/ o9 [# S* c
int fd;
6 f; t$ X, @4 T0 ?; [1 h) k( z3 U1 w* c int *mem = NULL;3 K0 |+ V% K. v4 ?0 S/ {0 T
2 s9 z6 n8 q( w) Q3 @9 Z
if((fd = open("/dev/mem", O_RDWR)) <0)
+ {0 X5 U' q% H' l- o: b) l$ \ ]9 z {. F$ F) I; | `/ V9 k
perror("open error");
1 J) `1 E2 B! \2 q3 R1 A return -1;( r( Q- J) [6 c) Y
}
3 A9 M# a2 Q# \4 S4 U/ `
) i" |2 ^! p, r mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ ]9 p0 y( r6 _2 H8 q1 d
& A( S! Z) C9 j" W/ x! H
while(1)
3 ~" i: K9 I! _' N' h1 F {2 ?+ ~4 @1 {* b6 V+ k" a0 o
read_MSG_buffer(mem);
; q) g/ u* C8 z8 F8 m" a8 F3 A4 l& c }
" r* c: F! O) b. W9 z% H9 s}& Z- n' ^7 G, _; V
$ ]! Z) T7 Z. E) n9 y Q
void read_MSG_buffer(int *baseaddr)
D* S7 x# Y. ^4 I! _; l2 O{1 z& b& Q: d7 Y2 Y# C `
pRX_MSG_PROTOCOL pshreRAM = NULL;# @% `0 i: K9 r& e9 K
/ [: d# n% `( M7 n8 i pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 z. E5 w \$ X! O, q, [- y) `% P& _
, ?; U! k9 _% b6 ?5 z) B. H# _. X
if(pshreRAM->packet_cout != count_copy)
* I. r1 ]' @3 ~% M" B: j9 k {" u& G' ?" i% M9 T; n5 X! {. e7 m
printf("a is %d\n", pshreRAM->a);! v4 A3 h- [5 g! H
printf("b is %d\n", pshreRAM->b);
9 S# e( a7 A( _. ^- F2 V2 H" j! X' ?" f printf("count is %d\n", pshreRAM->packet_cout);* x& X( R$ h( ?9 F. }8 T
count_copy = pshreRAM->packet_cout;7 ~ x& I9 H8 ^, ~6 r& _( ]' k/ G' n- x, n
}& m4 E3 y) L- [
else
7 Y1 ^6 |: Y) E- s; s, H {
( h( ?# R5 z- P! S+ j2 ?# y0 L printf("No effective message!\n");- h4 ^, m, r2 |/ y3 F- z9 [2 F2 T
}5 w4 ~: @. S! I+ C9 G: c
}1 E, l4 c$ Q" f. S
) c5 @2 q% A0 M7 y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???8 I& _4 f E0 I$ P1 C3 d
+ X/ I. f6 |) Z( k; x) l' s' w- b" M: S' N$ P2 r; [# o
8 h; u- j) g; r* T+ y: D6 o! t& h c+ J7 [7 ?5 I5 }9 k1 `
|
|