嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, y0 ^4 q, a3 a& j' m
0 J6 w1 ]7 C; j: ^' c3 o
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 b" m0 y4 h* X+ K8 Y
#include <unistd.h>
' Q q' C( T1 z
#include <sys/mman.h>
8 {. x9 n g' Z8 h
#include <sys/types.h>
+ `, G/ d y: h9 ?
#include <fcntl.h>
8 _1 p/ {$ X" {3 H* s
: m" s$ x# U& I% _- g% v1 O: q( q& S
#define SHAER_RAM_BASE_ADDR (0x80000000)
# d# j' Z( Z, ?, n2 `4 |
2 y ~1 q g6 G/ C
typedef struct
7 O; f) u M1 `# E
{
* Z7 x E: R8 q3 f! F0 {# Q: j
unsigned int a;
# W# D9 [/ k) f& ?: S. o6 c
unsigned int b;
& u/ J* f, Q3 F8 L) O2 \4 N. l
unsigned int packet_cout;
8 R9 t* T$ |; z4 l) B( F1 V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( m; H$ C. y0 n8 k
_! w/ z3 w0 q- y6 \7 ~# I. z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; M% h5 z3 r" A" r& U4 b i
unsigned int count_copy = 0;
t9 N0 }. }0 l. o( ]
6 `0 |+ s! D9 |
) }" c! I- C6 t* ?
int main()
3 ~' ^" h$ U" h. E& G1 V* m3 L
{
- n; |6 f# x w4 l, n# q) {
pRX_MSG_PROTOCOL pshreRAM = NULL;
- \# M: t' \$ i. }; P! {
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ x$ u p9 P \3 l2 Q6 @! _
6 Q, v" m" k* C) \2 ^1 R
while(1)
: z5 ?, O0 ~0 g- S0 ^* F
{
/ O4 D: V9 {7 h
read_MSG_buffer(pshreRAM);
; M) c- ^; J& l
}
, M( Q3 y/ L+ @0 P% d: h
}
9 a$ T+ ?+ k4 O
5 ?" |( V. a* ?. g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) c8 ?- _1 Q/ O6 B
{
8 g; s: S f" V; D6 ], b
RX_MSG_PROTOCOL buf;
4 V! a# ~. n( K6 c4 g" q# s+ J
( j! |; U! s! Q( R! {
buf.a = pshreRAM->a;
" U" M: O( s% v
buf.b = pshreRAM->b;
1 S. ^- ]: e4 j0 g- D, _' g
buf.packet_cout = pshreRAM->packet_cout;
5 _1 \# o% ^2 H' s& L j" I
/ m+ y, A v2 p8 p
if(buf.packet_cout != count_copy)
3 ]4 O) o2 Z6 W4 q' k% V
{
) f; {4 H$ g% w* c
printf("a is %d\n", buf.a);
+ I* ]7 X4 k+ R& d/ L# j! A' W! V
printf("b is %d\n", buf.b);
$ A8 O* s. C: p, a) C; ?; L& ?
printf("count is %d\n", buf.packet_cout);
1 q/ n* Y# x& j' l/ O
count_copy = buf.packet_cout;
7 o* y6 {3 S+ j1 o9 ?
}
; g, x) d- n7 \2 Q$ p1 O
else
# X: w4 u8 X- `" L
{
+ o U/ U6 }4 H; {" A
printf("No effective message!");
' l O* p9 ~& s
}
& ]' g4 l" c% s- U# C
}
# N. b2 {, L) H6 ^8 E
" v9 f1 }! F, |3 P$ q5 I
7 v/ N* Y( Y/ `) |; p9 C R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! E) t u3 ?7 H5 W2 S, @
使用下面代码,对内存使用了mmap函数后:
; t' b/ }0 G8 j. Q. Q a1 v- l* w+ ?
#include <stdio.h>
) u7 r. K' x8 S4 Y7 Z
#include <unistd.h>
: P2 j7 ] I% U2 u4 c% |6 j' p
#include <sys/mman.h>
7 }3 |: p6 n) d6 @2 n. ~- b
#include <sys/types.h>
+ j' t# } Q* g
#include <fcntl.h>
2 O! n% u* k6 A) e$ ?
- P" `* `- K' o2 `
#define SHAER_RAM_BASE_ADDR (0x80000000)
. ]' E4 w1 T# }! F1 F. }' b ^
#define SHAER_RAM_SIZE (0x20000)
/ g! m" d/ [ b$ a$ J0 ~
& Z& n6 J% J. Q' w4 Q
typedef struct
8 e% W4 t0 O) V9 P
{
8 p% L4 R& A- L% f9 g
unsigned int a;
. K- |+ s* ]/ J* e6 [5 y
unsigned int b;
( ]; w8 s3 K/ j# O0 `# b1 X
unsigned int packet_cout;
. Y9 B9 B2 {7 U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- O R5 o( N* N7 h. q
' }1 L5 z Z/ R" z' B
void read_MSG_buffer(int *baseaddr);
& z, m/ ]6 F1 t* T: Q
unsigned int count_copy = 0;
k# T1 i: n; W
$ D' J: p' J6 h
int main()
0 y' j+ ^, S6 u5 N- g" o
{
* [. \8 y( N4 [! A% K
int fd;
9 L) f7 F/ I8 n7 I
int *mem = NULL;
. o u$ V/ v+ ?2 i
8 ^* o3 {% G9 r/ W( H4 p
if((fd = open("/dev/mem", O_RDWR)) <0)
" I4 b% z5 J! Q
{
1 f) J& ~% L; [
perror("open error");
0 F3 B _: ?5 [8 G% c1 y3 O
return -1;
/ `8 M( r$ v* Y- W
}
) F3 }% q* }, X* b
4 x% j+ g# `( w) R
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) E* i- y( J4 @' d; M; t
* u1 P! O: J1 y$ y r9 d% `0 |* M, K+ d
while(1)
. _. j. M1 s/ I
{
$ s, G+ \9 y( y8 h8 l9 P6 c# V
read_MSG_buffer(mem);
* o9 i X( U" r: J1 D4 c: f4 Z$ D
}
! }: s8 o( A+ d! ~, r" K. j- I
}
& F0 Q" ~6 x. V- v9 l
8 C5 @ c. `/ V1 L: B
void read_MSG_buffer(int *baseaddr)
9 i8 s N; N# O5 s
{
8 E r! U. W% x! k
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ U/ P# Y E% s- E% X+ m
" i8 W9 c! m4 q0 x# E* w3 z
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' ?8 k+ _8 u% L9 f; P: \) t
1 @3 N2 K8 L) @0 s, k3 q
if(pshreRAM->packet_cout != count_copy)
9 N/ k. d2 c9 T
{
9 a' @6 e% f: W1 E
printf("a is %d\n", pshreRAM->a);
. ` [; S3 v; f& d# V M. ?
printf("b is %d\n", pshreRAM->b);
& o/ Y1 R0 r$ }% Z+ e
printf("count is %d\n", pshreRAM->packet_cout);
1 _+ t' C, a9 ?, d/ u5 p4 f, [) n
count_copy = pshreRAM->packet_cout;
" C3 g( [) c( L% ^2 h$ H' v3 L
}
% S! K# ]( R# V
else
/ S- K; V5 d7 F) G7 z
{
' N- b* n9 D; J. [$ d
printf("No effective message!\n");
* q$ H! ^' @% v- E8 u1 Y
}
4 E! l8 Q* g3 ~5 O- I1 |/ K/ X
}
D. @3 |* L i9 D [) ]
1 ]- m: \, s! O* b0 n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ E4 o1 H; x0 k) {2 ?2 X
0 n4 }* v+ b. K. g: y3 ^
( ?- N" h v+ F, R5 H* C
: A, ~4 i( F+ F0 Z, i
" _+ d: |& E1 \: Z- Q- g$ V- R
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4