嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 V8 S9 e; a9 v& J' C5 g$ Y. u
3 Y3 a7 w! a4 Y& j9 s& f) q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- |2 y' q! i o+ J, I0 O
#include <unistd.h>
) d& u' @# Y6 c$ l- v
#include <sys/mman.h>
2 V! y- v% C7 s( c$ e
#include <sys/types.h>
" j6 F$ ^8 W- C2 m: N9 \5 _/ a \
#include <fcntl.h>
j: ~2 z4 J6 X! g- }+ m7 h# B
9 A# Z6 W0 w- H, Q5 j& X" W
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ `1 {7 J2 E8 R6 X, E
. N8 a' z I Z1 f2 j+ X
typedef struct
$ q$ X) ]' b6 m9 _3 U# B2 g/ |7 Z
{
/ M; c/ ^5 [) ?( I$ a
unsigned int a;
7 s3 b+ ^( \1 m
unsigned int b;
( s* U, X! ?( W1 [" N
unsigned int packet_cout;
% M5 U0 ?* A" N" T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& a5 ^& E9 Z9 u8 x$ m
8 a# g* v( Q, w* s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: t5 g3 H$ w) _* D
unsigned int count_copy = 0;
9 [8 h x3 R, l$ d. Y, ~/ I
$ h6 E: `) m6 @# o& f7 ]
! U, n% v2 O3 g
int main()
7 V N/ y2 L8 B8 b* y% t, F; h, m1 v
{
/ M1 h! P# u* A4 ?1 ^$ L
pRX_MSG_PROTOCOL pshreRAM = NULL;
. c9 `3 w0 ?. @% }8 z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) c: h& z1 g% w! @# E( ~5 @
3 F. h: y. C- y; m
while(1)
1 {- e. i/ R7 h3 }4 w' d2 S
{
& `2 O; m. @ n, l, x
read_MSG_buffer(pshreRAM);
! e. V9 E6 F4 p; O
}
3 F# T! p' u Q
}
* d! f* f# H6 _% q; K4 Q
2 Y* D3 P1 Q. \" A3 M# g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 [" u3 A8 W! p9 ]! e! P/ t! z
{
$ r x) J! y; M/ y, j0 c3 D
RX_MSG_PROTOCOL buf;
: Y+ o; Z p5 j
- D4 H B; B A- H
buf.a = pshreRAM->a;
: B- ]5 O% r: |* p. g
buf.b = pshreRAM->b;
' d4 @7 F8 X( ]: v* j4 a6 O. f
buf.packet_cout = pshreRAM->packet_cout;
1 p8 u, x# m# i6 ^+ e9 B5 k
( d* u- }+ P; {3 O1 Y, j: Z
if(buf.packet_cout != count_copy)
' o& v: L3 I7 ~' M7 M
{
2 j1 O4 k, @ E" J: l1 K
printf("a is %d\n", buf.a);
+ \ Q7 B2 P) T1 X! [
printf("b is %d\n", buf.b);
6 P1 O0 V; \# I
printf("count is %d\n", buf.packet_cout);
" L' i' j* }( {, N# i+ w0 V
count_copy = buf.packet_cout;
+ x: {4 Q, `3 c' u2 @ n% \
}
' |# ~1 Z; c5 W# u: V4 j
else
) y, [; ?8 p. L) K6 i
{
: T6 y+ n$ c* y& E' N* D
printf("No effective message!");
5 T" J I* \6 n8 P9 i' M
}
? g5 P) U# m+ `) [3 l. J" v0 P" a
}
( a4 g5 H4 a! B+ L8 h5 N% Q. H
( D0 i+ l! u* l: N9 R% Q- Z
1 o: s1 ]1 L6 }: C& [
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* H( {3 ]% C& `. L1 U& ~: U# s4 a
使用下面代码,对内存使用了mmap函数后:
* t+ {$ _. }9 w) t- U/ r+ u
#include <stdio.h>
, @0 D& E e/ K1 n' O5 Z* @4 P
#include <unistd.h>
5 M8 ^% @' n. ^0 u* F: P( e
#include <sys/mman.h>
3 V- m) o5 u! @8 e1 ?
#include <sys/types.h>
& b4 f X7 C/ a6 s+ P3 V
#include <fcntl.h>
2 q3 G( a5 ~; a6 D
. W& w, R; i9 @$ t6 W# h6 l
#define SHAER_RAM_BASE_ADDR (0x80000000)
* O3 o/ W, P1 X2 t6 n) v/ d4 w9 }
#define SHAER_RAM_SIZE (0x20000)
/ z5 d/ U4 b" p& |4 h* l
) z5 j4 h; p' ^% u6 ~3 I0 j d
typedef struct
3 w2 l# W/ H4 ^! L
{
. d0 o8 r8 q7 A' c1 J, z% ^
unsigned int a;
0 H3 A* B& ], ~# K+ ]
unsigned int b;
- ]' N) y5 v1 J' u0 E
unsigned int packet_cout;
5 ]) G& R! V" R* Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( r) v8 v4 E( \5 Q" M3 _
' ~& N9 a" N1 l% B# f: f$ [
void read_MSG_buffer(int *baseaddr);
. V, C4 b/ S* K1 O. c. H
unsigned int count_copy = 0;
# X" y) `9 Y5 j/ g. E' d5 I3 n
N/ ]. T, ^9 @ I& M% a4 L
int main()
" Y/ H" Z$ D" a S8 K
{
8 M B* ^ w% s$ O$ k$ a( ?
int fd;
; j- \9 M) V; g, I
int *mem = NULL;
: P; d; u& x9 q. f4 T
+ M0 u/ J! n! E" U# s: w
if((fd = open("/dev/mem", O_RDWR)) <0)
8 X9 Q9 m" P1 _% A1 F, X+ w% t
{
6 ^) L o* b% O0 J
perror("open error");
: Q( f, v- b' }$ k5 u/ B7 r" a
return -1;
( T% V1 Y2 z% k5 b2 D# p; E8 [, o
}
1 f C% X) I2 [+ c+ z! s, t5 q0 l
; K* K' y7 L/ r8 j8 y! P
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 Q' n p% W1 ]* L) ~- t
( d, I, N4 W7 \, p/ J- u% \
while(1)
9 g5 X- m4 p, P5 p* O( W* B
{
; j1 |! M5 K% C3 z
read_MSG_buffer(mem);
$ }4 i+ l4 F O$ I7 b9 _' Y
}
# b1 @4 y" N/ o& d8 ^5 G+ ^; W
}
; D. |, `; W% n3 [5 X
) _% n! Z! q& f$ w
void read_MSG_buffer(int *baseaddr)
4 _7 \" L& A0 Y0 V O
{
w& V6 Q9 f3 {- b3 N. c2 |
pRX_MSG_PROTOCOL pshreRAM = NULL;
% D2 L2 L- Q5 O$ a
0 U2 P, m* s' {+ @) j$ o9 \
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 n2 N. E0 A2 B& |) s G/ a9 S
/ w8 ]: p2 c1 g2 m0 u. }1 e+ {
if(pshreRAM->packet_cout != count_copy)
" l% s; c- n$ U+ O h
{
! ~' |& e1 z2 N: a- ^7 C
printf("a is %d\n", pshreRAM->a);
4 X4 b4 r7 i! Q
printf("b is %d\n", pshreRAM->b);
i/ ?/ z# z7 J9 Q( j, [5 f
printf("count is %d\n", pshreRAM->packet_cout);
$ |( C0 R% N# I4 n3 u4 {
count_copy = pshreRAM->packet_cout;
# |9 {) j7 Q( e% t5 o
}
# j5 u3 n! ~) t' @ j) Z
else
9 D9 R9 R. m' [1 m3 Y/ q l
{
: M3 _, [$ W& e f) r" X
printf("No effective message!\n");
4 w- @7 n4 n* c# Z3 l9 j8 K
}
) G4 d5 S2 L$ w; d
}
, J' R2 t& U! x0 M
" y2 \8 S% J1 z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( n5 q$ y Y- W
: j5 U+ S) R1 t+ U. a
: t' L6 z6 M/ a& Z3 i7 r. ?
3 t- h# A$ L! u, |6 D) O- l! a4 @
# a6 c2 W; a5 [) T3 \% a% R
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4