|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 [- V- N+ J2 ]1 k
4 _/ k) B; ?& F6 z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- e6 z/ J) R% s) @% n6 r
#include <unistd.h>
7 m4 b% H% X8 d) {9 [: \#include <sys/mman.h>9 e- u# `6 h5 P' G) d
#include <sys/types.h>
1 p9 b' s( |! ^" T#include <fcntl.h>
# }4 @& ~; ]$ D/ V4 P8 b/ A2 k" U1 |
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 c# g' w" q: ?7 t
: {% [/ E) R- N+ W1 g8 Ftypedef struct
- A; q8 g7 G: D{3 Z A# H- x8 f" u1 G# j
unsigned int a;
G$ A0 ` o1 D8 k4 C unsigned int b;0 U F+ ~$ e. D- `/ |9 Y5 G+ T
unsigned int packet_cout;) [% ]5 P1 ^! O) ]0 O$ E* t. Q, A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 M. e a r1 }( b
6 i @( E- Y& n- z( svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 [% G' Q8 m. k1 J9 O
unsigned int count_copy = 0;( k) L4 c4 j: I; u5 }6 k
& Y2 `+ p9 L8 M0 a
$ K) i. w) ]! `5 [6 ]int main()
6 y/ z9 ^$ D8 r ^! T# _{
+ c& @% D' O* Z$ Q1 a: A9 l pRX_MSG_PROTOCOL pshreRAM = NULL;
2 \. D: \% t1 S; g pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( E8 {0 `1 a0 y1 |2 Z
# F9 e I5 A, q5 z$ U2 b
while(1)& r/ _& Z }, K8 Z
{3 h3 A! _ @! D1 N a, b9 T
read_MSG_buffer(pshreRAM);
8 [3 G5 s, D7 {8 a4 |* n5 S } . ~8 V0 S6 r, r1 m+ `) R
}
- |. r6 {* b7 q$ K; g* L; C: |8 d+ \6 W: o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 z+ f8 B7 Y |5 x1 I+ }
{ ~9 J. c0 W2 s$ w/ x
RX_MSG_PROTOCOL buf;( I; c# D; T; B6 e
+ I4 {1 {/ O* w. ^5 C1 z B
buf.a = pshreRAM->a;
7 B+ w, S: W5 @) k buf.b = pshreRAM->b;
E8 W: x o3 o& |. r: c( P2 F2 {8 Q buf.packet_cout = pshreRAM->packet_cout;% m4 y& ]7 d3 N' [' p& {
& `* m* q- t/ N8 V q/ p0 q
if(buf.packet_cout != count_copy)
/ B1 i5 p: p* C {# f: A- \ Y d+ t+ B4 H9 u3 J( B
printf("a is %d\n", buf.a);
8 u& f% f) L- v5 r, K9 S) D printf("b is %d\n", buf.b);
6 j& W0 @1 r# h1 [$ M F" \ printf("count is %d\n", buf.packet_cout);
$ Y+ ]4 \) m' s count_copy = buf.packet_cout;$ l: j5 g \9 _% A6 e8 y% [
}5 U2 H) ?( f3 y; ?2 H
else7 q& B6 `. ~) {: o2 r
{# T0 m# B" c5 p: R0 N
printf("No effective message!");' D) L: x$ D; X8 ^( \6 w }7 t
}0 @; D& I0 H: R% N* u8 O$ e$ K
}: K$ _/ a c: d. f! ^; p3 B
2 z4 v' w {+ d0 @- i& e! b+ ]
, ]; [1 H0 R% U3 N% S1 }, }但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% i1 h% y& L/ |, p! X1 z
使用下面代码,对内存使用了mmap函数后:; [# D0 W! Q8 T% y! l3 L! U; @+ b
#include <stdio.h>
4 T3 L1 F0 G$ r" G& s- b#include <unistd.h>
* q: i4 @5 R1 |. e) ^5 {#include <sys/mman.h>8 ^ Z7 W* [* @8 c5 |% ^
#include <sys/types.h>& H! T) d& F2 S7 D5 M" N
#include <fcntl.h>
; L$ L5 t* u5 ~6 C9 L; V: m: L z) ^: p: G; Z
#define SHAER_RAM_BASE_ADDR (0x80000000)7 Q7 h E8 P1 ?% s/ P7 U
#define SHAER_RAM_SIZE (0x20000) }9 i6 v( [9 F) T, P" s" a
$ t. v6 W; U X) _& t5 Q3 Etypedef struct9 e: @, u. w" e* h# r0 V
{/ \2 ~4 s3 E2 L O9 S
unsigned int a;6 n; B$ Y; w' w
unsigned int b;3 t0 d4 ~; O+ ^! E3 f
unsigned int packet_cout;
5 N! p$ I& T) {: u}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 w) Z: {- d1 V% r$ }! o' g, }0 Z2 u, Z
void read_MSG_buffer(int *baseaddr);# }1 c/ ~& f2 @! P$ O% {
unsigned int count_copy = 0;
; S; A$ T5 ?$ O% `) f& S4 j
) Y0 ?. ? N; r; Tint main()6 J5 ?/ a1 Q: t% S
{& J+ n# M# \+ @: |4 f2 }/ K5 K
int fd;
+ c6 {# q. z3 `2 T/ t2 c int *mem = NULL;. ?/ N5 M* H0 n; Z5 W2 D9 m
/ y( T5 _3 C# r3 m if((fd = open("/dev/mem", O_RDWR)) <0)
2 a5 j/ [+ q S8 A" u5 `% i" ], G {
m2 T w3 E/ p/ z' S$ D+ D perror("open error");
- {7 T. O' m" i+ D$ f. d1 \0 T return -1;2 \- D' |$ ~0 |7 s7 r0 T
}
& M6 N/ r9 R2 {1 p/ H
/ o* u5 W& A6 E7 b- U" C mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' K2 y" f; K, O6 P
% F( h2 m9 E5 P# K while(1)
6 F1 j2 E3 n8 |) ~5 C( r) ?- L: ~0 u s {5 v% B7 w1 D7 G
read_MSG_buffer(mem);, i/ y3 {' x* W# M8 l
}
1 c2 X2 a9 H7 y}6 T# h/ q, `* I' K) X% a: ?
k, m& B' d4 R$ }$ yvoid read_MSG_buffer(int *baseaddr)6 u& R! h5 R6 _7 q
{
' f3 o2 w+ @& t6 K pRX_MSG_PROTOCOL pshreRAM = NULL;
! q1 ?$ D2 y2 q
8 H0 H$ Q% Z5 v P( k9 h$ E pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ G6 f* W m8 ]* C9 T- p6 \. s
+ v2 H0 H9 e: z* F- b
if(pshreRAM->packet_cout != count_copy)
3 Y7 _( h( x; q8 S" c {
! N; O" {$ w* L( h+ d! l printf("a is %d\n", pshreRAM->a);/ M2 H( {1 ^( f9 ^, k7 v) Y i
printf("b is %d\n", pshreRAM->b);
4 U& E& t. P+ B9 \4 Z* ? printf("count is %d\n", pshreRAM->packet_cout);) g5 r d3 Z. k
count_copy = pshreRAM->packet_cout;2 ~0 A' v! j/ }/ g/ `1 p
}* B- a+ O9 a& I8 e
else
- d+ Y9 v5 T) r! c3 v# q" j i {
+ x2 ?" g" G: M: Y k printf("No effective message!\n");* B1 v% a$ Q8 E [" N, x) c
}
) R% g+ w2 T# W$ H; q' v4 m9 `; ]}: D, P. t" o4 v2 W8 d+ F
5 }& _4 q. G( u7 G/ o
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 J! w. W' n: u" C% {, B# i, Y' \' O( f1 V4 ]# G/ l
' Y# {. p; I; t% P/ U( `( Y1 c
. d5 ?; e: W, N5 X3 G" Q W4 g3 A, s
# S0 K( P+ I0 [9 ^4 R |
|