|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. K) [4 m% v, a c8 g
6 `5 h5 w' s8 B) S2 bOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! q$ e5 t# y. H- S#include <unistd.h>+ X- B H, Z' T, k+ |- Y. o- h, e
#include <sys/mman.h>
B# h0 \5 u7 _#include <sys/types.h>- i; x# L p/ e$ |* {- P& z
#include <fcntl.h>
; S+ G; @$ ?3 m6 z
, Y# A' u* o" a2 `( V: n) X#define SHAER_RAM_BASE_ADDR (0x80000000) 0 Q$ W8 ?7 \$ p" j3 T
: G, G* ?. p/ w. n4 l" Q# O) m
typedef struct
" |) u& q: P+ d0 o O, j, w7 h{$ F: x; x% b) M0 I9 l
unsigned int a;' ~7 p0 K2 Q# G0 c |' }$ Q
unsigned int b;
! x" `; ]* E3 O: | W: K unsigned int packet_cout;" w1 j& q# r7 ?8 x' b0 c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ w2 T: f% i, A
# n. {7 B2 y6 A0 {3 W) J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 w+ u; |" x; X8 e
unsigned int count_copy = 0;) g- o _- `! a; w4 Q' j! O
- d$ g) V: t; L/ A
7 O: r( e2 B( b7 P% N! @/ o; Y
int main()
c1 C) R/ N5 k3 f$ @ j{
8 U+ }: c7 c& @ pRX_MSG_PROTOCOL pshreRAM = NULL;
: S" P% w. s/ [5 s3 k pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 F5 `/ a4 {+ }
* ^! N7 Q/ [! z( c/ k2 t- ? while(1)
0 ? \+ L' \5 m {' V" J; g; S" F3 a6 }! G! f+ ^
read_MSG_buffer(pshreRAM);
- U, p9 ]; V I U }
' Q. z. K: Y' H}3 V6 }" w$ j6 ~$ c& G+ p7 j
8 f1 C8 w, @4 I5 C6 a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ Q: q( I* C2 h% d{' l+ _; l6 B- T2 J" v, `& x
RX_MSG_PROTOCOL buf;
7 V7 B# \' r/ m m5 F 5 U: `2 O' Y+ a
buf.a = pshreRAM->a;
1 P/ Y M9 g+ Z3 \& Q$ W9 w buf.b = pshreRAM->b;
' T. c; U+ S: u4 a- d buf.packet_cout = pshreRAM->packet_cout;
8 K# |: p, S$ Z , M" ]" F1 z1 E+ S! ]
if(buf.packet_cout != count_copy)* L6 r; `) A d8 n8 g `6 f
{
' p* O4 k! D- ~6 s printf("a is %d\n", buf.a);
. i/ Z N/ K+ [( x; \8 H6 ` printf("b is %d\n", buf.b);1 r( m- X+ ~$ H& B5 o1 i
printf("count is %d\n", buf.packet_cout);
6 B* f" t- E' R5 M/ e( ]: T count_copy = buf.packet_cout;
2 Q$ O- f4 w3 E. z# P }
7 A: v7 [, F9 _, d, N" O+ B else6 j; c/ T7 U6 ?$ K- s
{
7 V) ~5 x: x, A) o printf("No effective message!");2 j D; m" f0 Y# S7 K# A
}& m% J; ^1 O! u4 a9 C2 B
}
* }% |9 C9 p8 E3 ^9 q; z6 p* B, R, l( T6 N! D
6 z. A7 f/ V7 m4 T; q/ D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 i! I# x; U) ~! n( ~* h使用下面代码,对内存使用了mmap函数后:
, c& k* J) c7 I* I9 u# t! Z#include <stdio.h>1 W! z- _5 m, y5 O& D
#include <unistd.h>% z( d, O. r, }
#include <sys/mman.h>
4 e; `5 S' P# k' {* l. f: D#include <sys/types.h>% H J; G: A3 Z) Q5 V4 D
#include <fcntl.h>
+ F% N% v8 @( N' f3 Q4 @; F1 E/ k1 s& C$ U" x
#define SHAER_RAM_BASE_ADDR (0x80000000)
# C% |4 ?5 C9 {8 p; `#define SHAER_RAM_SIZE (0x20000) 1 u; m, H7 L& ^" {1 M, S
) {! b& D1 `4 K3 `! c1 m
typedef struct
! c3 C* K6 ~5 X- y5 v7 Z1 f/ i{
1 n/ ?7 }6 Q3 p; b# B unsigned int a;& w0 }) e# y% k2 \8 y. P
unsigned int b;+ l& E) \: \' ~: f" N( A
unsigned int packet_cout; A4 y# T& h; A Z/ d' H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
`: N: [' p' b$ V1 W( K |% R9 Y0 G' a/ H- _9 `9 I) u$ Y
void read_MSG_buffer(int *baseaddr);! K! \+ @5 S3 z. C- [
unsigned int count_copy = 0;
/ U3 o* n) g# Z% i" \8 X- q% {$ r) b+ F; {9 @6 {7 M
int main()
, s5 i4 K* z( L# p; L7 N( e{
# Z$ R3 O& f5 b( @# m# F, G! r0 V, } int fd;7 n# ^! v/ I8 k6 g9 I( F# e
int *mem = NULL;+ `' F6 Y; H: b
) N5 g! a# d1 d$ H if((fd = open("/dev/mem", O_RDWR)) <0)
) D. I, `# q1 I8 H {
! i* U7 L' |8 `8 W1 x perror("open error");
3 j6 R9 `( B+ D return -1;
5 t, W, k" v$ V# l$ B4 a' a5 O }
# D3 q, o8 _/ i5 I
- m7 ]3 p* Q2 Z3 C- B2 g mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);5 j7 r6 b4 T, Z/ ]2 ^/ N
2 P+ Z# s9 t+ }, t
while(1)) F* e3 y8 u* S9 W8 p2 P
{
0 R( ]4 D7 O$ c( Q: N9 a' j/ e) T: v read_MSG_buffer(mem);+ S+ m* ~* [2 X
} ! u' ?* l2 @* z9 B" [( x2 O
}0 b" l8 k5 ?0 Z& h- g
4 l6 h* i: F: b% Nvoid read_MSG_buffer(int *baseaddr)
% n6 l& ?/ S4 D. i6 b{
; n K7 f( T3 g1 e+ ~ pRX_MSG_PROTOCOL pshreRAM = NULL;) M% |7 r9 h$ H$ d0 l$ f
6 N; ^' C. E% n0 f
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' |5 Y9 f. d7 s
- P2 [8 L0 p' R6 L | if(pshreRAM->packet_cout != count_copy)
9 O8 N7 n N+ a) @ {# P4 j3 H6 j; a$ g$ ?3 ?6 ~) d. c, \
printf("a is %d\n", pshreRAM->a);8 J9 e9 G5 D" F
printf("b is %d\n", pshreRAM->b);# @5 q8 O) J) y4 m
printf("count is %d\n", pshreRAM->packet_cout);
0 {3 E3 {+ ^3 o: P* W count_copy = pshreRAM->packet_cout;
& {# [% T9 \3 ^6 j! s" k }
. M0 R |. K" ]7 u9 y/ p else
O# U& s/ @. H/ c) ?0 l- b {+ I) q% S) A8 R4 W, u
printf("No effective message!\n");7 s1 |+ u5 x# E5 h% j
}
, C( ]" m7 F9 A' K. O) E: b9 K8 l}8 Z7 W9 I. O$ |- L5 N) s5 t
. u* y( q V, m% o7 }
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, W9 r- C K, |5 z. F
! N5 K6 ?; {8 `' S9 y- U' G6 h3 l) Z
. g3 J- f2 f" w4 ^
5 `0 T" I& Q, s0 [' [* ^. a- O |
|