|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 B' W; s2 j1 g) s G/ i% z% W$ p& I5 U5 z, E" \) p
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ |1 N; O0 I- _ y u9 t#include <unistd.h>; I: |; }( R0 B: H: d
#include <sys/mman.h>
# O& i! h d- m; i4 h#include <sys/types.h>
& E2 K" ]' b O( [/ R3 p0 ]#include <fcntl.h>, u$ Y Z7 s* h
& k; V; \0 w* O* t+ e
#define SHAER_RAM_BASE_ADDR (0x80000000) . n* e; j, t! P! `
: b- W" [% L# B& wtypedef struct
+ Q d {7 U& [( B. |( A9 d' ~{5 K- `; R5 ^/ r7 ^; h
unsigned int a;! { ^9 o- W4 |; @( v& O" @
unsigned int b;
) T- I5 ~2 V7 Y unsigned int packet_cout;
$ W$ ]3 K, \0 J) V* d& W}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 N* U n" L( b
) b& M! Q/ p0 h# _4 E `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( T( i q1 j0 x8 a A
unsigned int count_copy = 0;
+ W0 @- U" x0 m' {! V* @
- n- ]; W) N, ]9 Q0 x) W& c
& X. H4 Q: v6 mint main()
1 T& j; Z. f: h" x! t{( M2 h* {& K# d$ [
pRX_MSG_PROTOCOL pshreRAM = NULL;" U: y- y6 g$ ^: P8 m7 E
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* i! R2 y# c0 x4 y& Q! r9 [( U4 A, O' \9 t4 A/ W& ?) ~
while(1)' t& g1 r* K+ `" f
{5 s P8 H# v' V( |" N2 w( U
read_MSG_buffer(pshreRAM);1 i% J+ P1 ?7 V
} 8 V9 B$ N" G- w( B
}. L$ K, B- _& b. l# r6 y+ r
4 r; D* q& A9 P& G$ N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# W; D# s- u3 Z, i{
6 S4 B7 ?# a! C5 R& {4 N5 B6 a RX_MSG_PROTOCOL buf;
: r5 P6 U8 _4 ~8 W) d A2 v) v6 K, k+ _- a, n
buf.a = pshreRAM->a;
# q1 Y6 R. g8 {! K9 R0 w, }- c buf.b = pshreRAM->b;
* f X5 E+ c+ Y& ]! F* e4 f0 D buf.packet_cout = pshreRAM->packet_cout;
3 T: F' X2 {' S- n# {7 K
% w3 s( h6 X, c8 o2 b5 f, S if(buf.packet_cout != count_copy)
5 U% ]) k0 b7 c! K, L! N {2 `% Y! t# Z6 s: F; ?2 i
printf("a is %d\n", buf.a);
( |' e/ o3 S7 V/ j printf("b is %d\n", buf.b);- m+ k; q: W$ Z8 w+ g: I2 [
printf("count is %d\n", buf.packet_cout);& ?2 E$ ~4 a) \) j/ g
count_copy = buf.packet_cout;
# ]0 j7 e* w+ _1 J8 Q( e }
+ ~$ |" Z- |; y( { H# a$ R else
& ^3 K& {! Y6 M7 B/ I7 N {
" m9 U; L7 R4 F9 U& w- U9 l7 r printf("No effective message!");- X8 ^- {$ [1 g3 Z; ]# e& P; A
}
4 B/ p* o& x. d3 i8 S3 g}
. x. Z2 r! P ^9 r# Q1 t% V: V1 _
7 N& Q4 O, w1 |& Q$ |" W |+ a: x) `, ~2 R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ V" l( O3 G( F2 r! q使用下面代码,对内存使用了mmap函数后:
1 m8 n0 g3 J9 J1 V#include <stdio.h>9 X& ^5 n- ^3 l/ K+ I
#include <unistd.h>+ @9 n6 S) J5 q4 T/ Z1 C) O2 z
#include <sys/mman.h>6 j# Z6 e1 B% f% T
#include <sys/types.h>& r- P9 y9 n3 \5 ?, J0 ^' B$ Z2 g
#include <fcntl.h>
$ {0 }* M8 M8 W' w3 U9 h2 E! D
/ o: \- G& l/ T n2 M#define SHAER_RAM_BASE_ADDR (0x80000000)
; W5 _+ V+ ~, ^$ U" L( t4 l#define SHAER_RAM_SIZE (0x20000)
9 n! w4 K- O! [( B* o' y6 L4 n l
7 k% |; p5 ]4 D6 l' F3 R3 E2 c# ltypedef struct
( `, Z& s% S9 y7 c2 }{6 `7 D) f. c6 S- M# C2 a J
unsigned int a;
4 K* E% r1 A* t: J& t0 [) D unsigned int b;
) U, } L U4 _) w( }' v3 z2 | unsigned int packet_cout;
; `* Q7 I) C7 |4 v) N9 q3 s' Z. Q0 Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- S( f7 U( Q! f, o9 v
6 u8 [, G- Y8 }void read_MSG_buffer(int *baseaddr);
( k* P' g7 W' A% y% d2 C( N* aunsigned int count_copy = 0;
+ U3 K' [3 Z2 g: o; Z
' P! r# _* A& B( bint main()
1 v" s. b, ]. r7 A s* g9 O% G5 m{4 s5 i$ u8 Q! C4 V+ ]' @
int fd;/ \" Z1 ~; g H
int *mem = NULL;
- S$ }1 }/ n0 [9 m) f2 D; X! b2 H3 p1 ^' l
if((fd = open("/dev/mem", O_RDWR)) <0)
! ^ Y) [9 _# ^/ {9 Y- \ {
" H! M2 x/ [9 Q, b( E9 ^ perror("open error");, I2 |" b! l0 L) V& {
return -1;7 A& G1 \* z# C& J% ~
} R' _2 B+ V6 Y. A
0 L) A0 O: A6 o) n4 G3 |2 ` mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ J* `2 i4 d4 f! F( w9 J6 Q1 B6 Q
while(1)
! L f: Q% b" } |% b {
0 t% E$ I z4 H- K+ o& J- o1 v read_MSG_buffer(mem);& Y0 F1 Q" X" K* e( v4 V
} * y0 }7 ?3 p F% c x( w/ Z
}
; E. c7 O1 p8 s
- S _9 _+ }, {2 uvoid read_MSG_buffer(int *baseaddr)
$ r5 ]: I" K0 R$ H$ z# I6 h{
8 Z4 s a- q; M. V! J" V* ? pRX_MSG_PROTOCOL pshreRAM = NULL;5 o; C, ~) _2 B
5 S% P1 E" x& J/ R$ G6 X- ]
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 o( r: ^5 P8 @: v
5 |( N* w1 _+ X. `* |. X5 b if(pshreRAM->packet_cout != count_copy)
; d/ u9 r% Y1 b8 {) D {
9 M# }' e' k2 Z3 z9 o8 ` printf("a is %d\n", pshreRAM->a);
1 Y+ m+ h% @( }6 r3 b5 i' k8 E' K0 ] printf("b is %d\n", pshreRAM->b);# `3 @6 k" p' S- y+ _- t( X3 K, @
printf("count is %d\n", pshreRAM->packet_cout);
1 T) t/ A( g I) h. v5 O count_copy = pshreRAM->packet_cout;5 t% S2 W$ q, v& r) p
}5 ~3 o& z/ c s( {7 W) |
else6 m# S! l. _- z" r9 G
{
: C0 X2 B& c! _& w: J printf("No effective message!\n");
; R8 G" N8 z- \" d+ p7 P7 [ }
. Y0 y" v0 @0 G4 r6 O& ~, X1 D}
" }( d h+ \8 i. N) A
) i" d7 U7 M$ N4 a# n没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 ~1 J9 W& G9 W3 b7 \( A* i9 F
1 G4 t5 p8 h5 S3 `% O6 \9 \% m* z! s8 s* k3 \" `
) g0 b, J8 g2 s: ?3 p( @8 Q
0 u: |6 S+ N6 M |
|