|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & w; W* [( Z3 h5 f" U3 w
% Y6 z0 N9 b' q! sOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, @% S, p+ X" J. v4 X#include <unistd.h>. i! `2 L- M+ b3 C( ]
#include <sys/mman.h>" U% G0 C7 A2 K n; `1 a: M
#include <sys/types.h>
' u/ }/ `6 b- c9 C, q) J#include <fcntl.h>9 b' V1 v, B0 A% A$ S2 I
9 t V! K3 v" F. s z% c! N4 @
#define SHAER_RAM_BASE_ADDR (0x80000000) ! U- L. M3 h& A7 J/ Q p& ^& C7 @
+ b* B4 U5 p' W: m
typedef struct
0 [# B- j1 h% ?{
3 i, V- M1 [% i8 _ unsigned int a;
" P% d w$ S! Z) m) e unsigned int b;
( L% D# Z0 [: j6 R6 \ unsigned int packet_cout;
, p6 u% y. @# c% N8 U$ z$ W}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( C- f4 l' g5 a1 Z. a' q$ p5 d6 ^+ @& u. d9 ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( s' O9 j3 X8 B
unsigned int count_copy = 0;
. i' N7 G* Q7 e0 ?" ^! D# _
# y4 G- L7 d+ c5 S+ P) u6 |/ l
$ |1 a3 i4 A5 X5 j& iint main()
5 o) s- o* B; z# z{
% Q3 g7 g4 M; z# B( J% d" c( M) X pRX_MSG_PROTOCOL pshreRAM = NULL;
: {4 u5 k1 i9 B- y pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% g* J* Z, h- `) ?9 G
8 r4 A5 E6 \7 \& [* b2 @ while(1)
, ~; L6 E; @/ t {9 m5 b1 P/ {/ p6 O- Y7 a2 N# o) g
read_MSG_buffer(pshreRAM);( i1 P$ m% c9 p
} w( o0 ]9 g( ^. H6 S! H+ [
}5 r- v1 `4 x1 ~' L. T' s' J& P
% `1 ^- T) Y9 I) @' Qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 |/ o1 f$ W" j! I
{
6 e4 o6 i5 n2 s RX_MSG_PROTOCOL buf;
6 S Q% }" C' M: i + K. b3 x. b0 o0 x
buf.a = pshreRAM->a;; u' J2 Q& k3 g- @/ M+ Y+ L
buf.b = pshreRAM->b;* m( P3 O0 B* o4 Q% u% [/ v
buf.packet_cout = pshreRAM->packet_cout;2 d- y" y; J. g/ `$ ^
8 V: Q* p$ P1 d5 y( A if(buf.packet_cout != count_copy), a7 a4 }6 ^' u, {0 T9 ?
{; j3 b$ k" ^2 i0 ~( ~# O: ~% S
printf("a is %d\n", buf.a);' C' D0 `* Y H1 l$ b- x* ]
printf("b is %d\n", buf.b);1 D! }6 J( z$ N/ m! `: ]
printf("count is %d\n", buf.packet_cout);
7 Y( J: D# o% m; t7 I count_copy = buf.packet_cout;
, P' C4 @3 A* Y* ]8 h6 u; Y }" v5 T) f9 c R! ?6 w e8 `
else1 ?% u/ O) Z8 s- e7 i) i+ u4 ^
{
% t' e: c9 y" \1 I. z printf("No effective message!");
5 x% X4 ?6 w7 k }. O/ \) W" G' i# W. a7 g& B
}5 J/ ]' N% l7 D2 W0 S+ ]2 d
- M+ T9 |- T @
5 Z% B' ?* Z/ D! m& _! t+ k4 p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- @4 h6 ?( A# r- ]使用下面代码,对内存使用了mmap函数后:1 m' k$ E/ W" w8 q* P* P
#include <stdio.h>
/ y# I! m8 e2 [4 h* a8 t#include <unistd.h>/ Z/ p0 k, S7 j8 n4 d9 j4 V+ x
#include <sys/mman.h>
( R; F8 W: d+ ~! E* b& Q' p; ~- E# T% c#include <sys/types.h>
% M2 V) J3 b+ x6 I2 N#include <fcntl.h>. O# y0 e: O7 ?, z }
; E: h, R v8 l0 c( O3 y/ |7 j1 \
#define SHAER_RAM_BASE_ADDR (0x80000000)) D' ~1 s% u K! Z# F6 m4 R, b# H
#define SHAER_RAM_SIZE (0x20000) / |" _% c8 q% I, W$ a' f
7 E' u8 |% M y4 l% D6 P
typedef struct4 }' ^* ]7 _6 e) X1 W( e
{
0 a5 Z# P* b7 f! s9 c1 s unsigned int a;
/ w0 o% Z5 T3 A: ^! T* Y! J unsigned int b;
4 W- g1 F6 n8 l# p! O: c: {3 _3 @ unsigned int packet_cout;* F. M* c1 ^/ l" c& ` y$ v- `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 e1 @6 Q; c* M+ Z9 W8 g5 [: R7 M) B$ O+ L( B8 S
void read_MSG_buffer(int *baseaddr);& Q6 E# \9 ~2 @
unsigned int count_copy = 0;. l8 a" {) G$ @1 [7 a6 @0 e, n
# {1 W5 G! u9 Z- m
int main()0 I5 d4 v& x) F# I8 C/ u g
{
8 H; O1 B6 S% S' } int fd;
2 ?! y8 J0 T* I) W. p1 V5 X int *mem = NULL;% Y) J+ n0 h: z, |2 ?% d: z- K8 D
/ \9 n- x2 x D* e4 \& F! a if((fd = open("/dev/mem", O_RDWR)) <0)# L' Y L, T k7 V( `
{3 J8 A$ D( z0 P, T6 o, H
perror("open error");
" u. N( o5 y, y0 d: e/ f return -1;) Z; ]6 ~. `$ ]- I) I
}1 \/ k: s# ~' @+ v& A
7 t. f. m2 q( ~( R/ @/ i, K
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& J. R5 {: [! y# r7 K4 s
0 {9 F) _! h- K z, Z0 y while(1)2 I6 M( f7 e1 k
{
# n0 }" `, y( W) J6 c9 _ v! A read_MSG_buffer(mem);1 f: l) l8 P3 X3 i& u; K
} 6 I3 I+ U: S$ d5 ?0 P: @& k
}$ {7 I. \- |7 }4 t7 [% [
1 X! C! g) Y& `, V" Ivoid read_MSG_buffer(int *baseaddr)$ f' g8 x1 f6 y8 u7 G" w
{
# A. k0 h* b, }( y" H) e$ p pRX_MSG_PROTOCOL pshreRAM = NULL;
" y7 m' \7 E: ?: E+ B9 b/ n
9 O9 |3 |/ q$ y! ^/ J0 r% T pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- c3 z, O/ F* G: K) b b- O) n* `* O! p
if(pshreRAM->packet_cout != count_copy)8 y9 Q( {" J0 x2 d+ g
{# j6 Z: ~( c6 N
printf("a is %d\n", pshreRAM->a);
7 |7 ?0 A/ F# A5 h' |' s/ V& ] printf("b is %d\n", pshreRAM->b);
7 T8 H& w% e$ W( C* U, e printf("count is %d\n", pshreRAM->packet_cout);
8 R- L1 H# b3 W% z- \9 @ count_copy = pshreRAM->packet_cout;6 Z k6 O# p, m* v
}
5 x: e) V% ~ Z+ H. @4 ?, A else
4 M# b4 M, w! k6 ~; c' ^0 x! T {1 |& ~( ]+ e: R+ r; `7 Y
printf("No effective message!\n");9 r7 f2 H0 q+ G0 ?1 e# e+ |8 ^
}
3 @$ ~' G+ p. h- p: w$ K) V& Y}) T! d/ P- c) S: I( ~. v1 r1 w' Q
" {4 ?, I) b3 L) H* q6 E( u4 n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? T* K% Q4 Q$ T" z
8 ]; ?+ Y+ Z$ C) j" J: R
$ c+ r: V# j7 N" Q; C
8 S2 ~! o0 S' h# E, d: E5 P
1 f& b# J) S+ V) M3 V+ _ |
|