|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! i* Z( H& _) U' `; l4 ]% _& w- g' A2 `9 }! O @8 @- r
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, n w- R1 @4 g% i& Z% Y/ b
#include <unistd.h>/ p- J: @2 U$ E
#include <sys/mman.h>
8 j# D6 N* C; ^9 n#include <sys/types.h>
! s! m& w: Y: U7 h7 t- A! l( Y#include <fcntl.h>3 @. [9 M4 C# H: P0 J1 X3 h5 h
! M5 N+ k# I' b+ t) U0 g# t/ `
#define SHAER_RAM_BASE_ADDR (0x80000000)
% s0 c3 c) M3 @% j) r, P& c( p, O0 u! R" ?6 w" ]) h, H- g$ Z5 o
typedef struct
/ K& i& n9 W* E5 q{9 k) V$ F5 h3 o$ k; f
unsigned int a;5 a8 d& j( ], _3 S2 n, `- s
unsigned int b;: @0 A4 I* J! @9 S" N8 d: a
unsigned int packet_cout;+ ]. [# P$ Y: B" j- ^+ d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! F/ ]1 D9 x2 J r3 E5 ` e q0 D3 T# g7 T2 S# W S( m2 `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: H% }* g. [2 \2 \. c% C1 G) iunsigned int count_copy = 0;
; B) \( r1 [8 A9 @9 W$ W% B9 l) [. u0 Y* P9 n! X
* x1 K1 ]: q( Nint main()' V+ i6 ~* C5 a
{
/ q' |( V& ^5 t# R pRX_MSG_PROTOCOL pshreRAM = NULL;: Q- G& d; Z! e4 f2 r" Z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( S% v3 ^ t/ g& h T3 I2 y1 C
: F0 P: } G2 f; j0 ? while(1): N- x& s* ^. f# E! O
{
2 i4 r, J: [& t" C+ W2 d read_MSG_buffer(pshreRAM);. E2 N3 d7 `9 t5 h; z
}
) p9 V" `( [- K- w% Y}
' a% }- o/ f6 e6 k. O$ l2 e' {! s$ [" T9 g+ r' O' }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- l' M" E, v h$ z{0 |# E0 I8 c# J* X5 ^2 t& ~: [
RX_MSG_PROTOCOL buf;; x8 n4 e8 }! p0 O
+ }4 Q5 m+ d- Y9 I- Y2 ], ^. v
buf.a = pshreRAM->a;( V' s8 v, H) N
buf.b = pshreRAM->b; t1 W& v0 u! v$ _
buf.packet_cout = pshreRAM->packet_cout;$ o/ Q+ u7 W% n' J
) a8 t1 U7 u8 R' O9 t) U% J if(buf.packet_cout != count_copy)+ `- R: ]5 y4 ^) G, [
{
5 f) @, N% ]- L: D0 ^$ w( Z0 z printf("a is %d\n", buf.a);
( W; C4 w% ^: }* V printf("b is %d\n", buf.b);
! h) H+ R/ I) f9 ] printf("count is %d\n", buf.packet_cout);7 P$ }4 C0 D v2 d$ K
count_copy = buf.packet_cout;' h! F! R( z7 k) n% l3 Q& ~, p
}
* G+ }( J3 U* v else
2 x; T) E/ |% } {
( y( U9 W9 O0 t3 ]) y% j+ y printf("No effective message!");
. T% Q1 @- k1 B) u% Z }. Q( `3 x1 l( C# D
}
7 Q; b* r) e* I4 L3 O; w9 @1 L6 [6 p7 G a/ ?" v
" m0 I; H/ [) t2 S' Q但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" n; G6 s% b* h7 A; ~5 [
使用下面代码,对内存使用了mmap函数后:
! H* q9 Y9 D$ ]+ p#include <stdio.h>7 K' A/ B' i; e4 S% Q# q( i
#include <unistd.h>
0 F6 g9 M) y/ ?' m) ]" h#include <sys/mman.h> T( u* Z& @; K, J+ z6 j
#include <sys/types.h>7 B) F0 k) { h$ u
#include <fcntl.h>$ |/ g) a( X7 q- r: u
# H6 N8 v1 E e#define SHAER_RAM_BASE_ADDR (0x80000000)
* P& s* H0 G7 \0 A. K" r#define SHAER_RAM_SIZE (0x20000) ! m S% F" Q: f6 o( M2 o; L" o
( y; D0 Z3 w# X# ^
typedef struct* T$ X( Q5 x4 k; c5 s4 n' _
{; N$ \) E# J$ L
unsigned int a;
" _) ~1 K' ~% L! S/ j unsigned int b;
( z c+ G/ ]' C+ }) n& g unsigned int packet_cout;- ~) ^8 e- ]( s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ H$ [8 T9 ^) ~& d* @( u/ p! f# c! p
- \. c- c/ |& zvoid read_MSG_buffer(int *baseaddr);
7 C, t8 _) f5 Y/ s5 ^unsigned int count_copy = 0;4 l7 n8 I# x+ t1 f0 U
/ Z; t9 w+ }) \ c. s) d2 n) V
int main()
6 n( o# X: ?1 h# ?{
- I/ F' l: i+ X$ E int fd;
3 h A# K# `7 O$ x int *mem = NULL;) ]3 D1 f2 n4 G
: ~3 @6 d, ]4 z9 G' j if((fd = open("/dev/mem", O_RDWR)) <0)* d; v9 r$ Q& e
{
# w( g3 j% w- I9 A& b) c* A perror("open error");, P% m0 P9 \' [5 R8 E j6 H4 g/ P- p
return -1;
# d! B# C+ C" W: e }8 N( n, @7 C* I. Z( t0 z- e
7 v7 e: r$ l! P8 c3 k. R mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* S0 D( z3 t8 w+ N- ~
0 L! J: u6 R1 j- X% Y' V
while(1)
- H' Q! A5 N$ L# W9 b% c/ c {: Y8 t! Q" {# d# l, ^3 K! b: o
read_MSG_buffer(mem);4 T, ~( s7 q5 U1 `4 u* p
}
# P0 h- l0 T ?* y3 Q# F}
0 o. s" q2 W5 Y8 q5 E) S% t5 \5 O4 s5 F; m# o- d( N
void read_MSG_buffer(int *baseaddr)
. L ^6 s8 ^7 g0 ]{
5 t4 N; \& s/ d4 X7 E: b pRX_MSG_PROTOCOL pshreRAM = NULL; W; u+ S0 ~" j8 e. w
' x5 @3 m( R, Y, F2 i pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; r' |! L# S }3 E( y% q# y
% h# A& s( l+ I" I! Z
if(pshreRAM->packet_cout != count_copy) p2 Q+ Z" I1 {
{
* a: s; v! N6 b; @( | printf("a is %d\n", pshreRAM->a);. ~2 X9 [$ b1 p2 [; O
printf("b is %d\n", pshreRAM->b);
# G* T. v {) q# g2 `- o g printf("count is %d\n", pshreRAM->packet_cout);/ [" {' w/ e; t
count_copy = pshreRAM->packet_cout;
: l1 S. t9 K% Q0 e- E V8 V }% O+ N \8 _2 |
else, \ l1 U7 f8 t, t% ^
{
, g2 O1 T/ u( ^- Q# w" O printf("No effective message!\n");
: r, d+ H; Y5 ]2 r [; m+ ^1 ^2 T# W }5 b4 J2 B* ]. P8 K
}% \1 Q1 Z- }; X& W
& ~% W7 _7 h3 q; I没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* O/ g3 B4 G/ I6 v4 t+ w/ Y
. t% M2 m) M" J3 X# R% [/ S1 m
- o( M2 m- f! {! U6 i- e/ |- d9 B; Y7 P Y0 N
& S5 _# Y+ w! I8 [7 Y& W4 t |
|