嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. t7 @' {$ C& V6 f
4 H0 m. K% Z# N j, e n$ k- |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& p* w3 j# I( S: a/ d. |
#include <unistd.h>
" {! f! ~7 {7 G; O! I
#include <sys/mman.h>
* F0 C4 g& |* B
#include <sys/types.h>
$ W" c4 a# V8 v5 l1 \/ a6 W
#include <fcntl.h>
% J! x6 _+ F5 E) J6 O: K
|0 p3 k3 w- @$ i$ H3 z- A: C( j
#define SHAER_RAM_BASE_ADDR (0x80000000)
, p9 S; ]. ?" a
, @+ y( V( J: p3 `; G/ o( }
typedef struct
/ z4 ~* f/ p3 [3 w
{
; H6 [; L" {( r# Y8 j, B1 {
unsigned int a;
9 @) ]* K$ {, C }& K. N1 G8 d
unsigned int b;
9 E1 F8 L2 B7 R1 g( l# g1 k9 ^
unsigned int packet_cout;
8 h8 l3 }: E' }% S, d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 q, j7 |5 L. z8 `
1 f6 \4 M: \" H6 \3 @/ N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' v/ }2 D' ?- n
unsigned int count_copy = 0;
2 I2 p; O* ]" `( a: r- j
+ t, m8 l4 L+ C3 F- I
5 P0 a5 z' U4 Y& L2 L
int main()
G+ G* I) { b8 W Z; z- x7 P
{
9 W1 W n" M l* g) G, o/ a, v
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ U, _& X) j6 `" j. a7 C" [
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 _, ^, N0 ~0 u; v
0 Y( }( X9 |1 S+ w
while(1)
; y/ ~1 |) t+ ^% l; E1 W, r
{
, B! B- v+ ^" _# D8 L$ O
read_MSG_buffer(pshreRAM);
' J; f$ [5 \' F4 Q
}
9 v$ N3 ^2 B7 R; U4 _' I; d) g
}
$ u% v' w( ?% J2 z0 R
9 ]5 z/ l! T, {" e3 p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 w# q( S* w# p. x! v& Y: c. \
{
6 p# U% }, x% y" M
RX_MSG_PROTOCOL buf;
% G# Q( M* E1 q- L/ Q
0 l0 O6 s- {4 K( R
buf.a = pshreRAM->a;
- Y1 f8 ~1 `6 V0 H, ?9 f7 G
buf.b = pshreRAM->b;
2 `) M: B* [& m; m2 I
buf.packet_cout = pshreRAM->packet_cout;
, x6 X: a. z& G0 f
+ Z) L6 X0 X* c( N4 L5 x) w
if(buf.packet_cout != count_copy)
' W: e0 L G# n6 n5 Y" A1 I, z
{
B1 I, Q8 a( w$ d
printf("a is %d\n", buf.a);
( c6 }, W2 I/ W7 z, Q V2 Y
printf("b is %d\n", buf.b);
8 ^) h: Y Q: g$ H- R/ j
printf("count is %d\n", buf.packet_cout);
9 ?( C$ f* G2 b" P7 c9 ?
count_copy = buf.packet_cout;
, \, u( h3 N- Z% `1 ?' t% s
}
% a8 Q; I. _& j4 D, X* F
else
7 j. ]; I, }6 O" A1 K: X
{
* X5 R4 d- o8 s: c
printf("No effective message!");
a- q2 N, V/ X2 Z3 w
}
& b3 a* S+ n3 B
}
3 L' u9 d+ U4 K2 z( m+ B; R0 M% b
4 \3 n$ c# ?5 m
8 e ~' a0 j& g' O+ J
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# _$ ?5 E) t; V+ k4 @
使用下面代码,对内存使用了mmap函数后:
' d7 C/ W2 X; w2 s2 v0 B
#include <stdio.h>
5 n& `6 S9 ?6 T* l- [: N
#include <unistd.h>
F" x4 \" T2 g6 U' D
#include <sys/mman.h>
7 r8 ^* K' i( K5 f% _$ ]% [
#include <sys/types.h>
) R: o8 }; z5 q! G t$ i
#include <fcntl.h>
0 S: a4 E+ P/ N3 p
' j: c+ p( p, e$ l* n
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 u! e' I% x3 G2 E
#define SHAER_RAM_SIZE (0x20000)
5 J" E4 |& B& R
5 p ]. Z. Z- d( v% }( ^# \! j5 m
typedef struct
5 q* ?7 }/ r2 f9 |% a" T$ f
{
: i! f3 ^9 C2 \) j: M- Q% o
unsigned int a;
9 }8 y! t3 f( ?4 U
unsigned int b;
9 A' q6 H8 n, t. W( [
unsigned int packet_cout;
( y& K. h. L2 Y; q% A+ Y" N3 c, T G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% P, W7 [' g, C- z7 F% m% c+ ]
- @7 ^( e1 y! r7 S7 R5 }
void read_MSG_buffer(int *baseaddr);
- m$ a& o9 R. c+ S* a
unsigned int count_copy = 0;
0 x; k4 d! y6 r% ~& C4 r# X
# c% a# V" \' W+ T" C" X1 \
int main()
% ~5 `8 x2 M4 z% P& a' H% m p
{
2 l" p' j0 E/ [5 M6 k
int fd;
) d9 U* ?0 E9 I# K1 V% a. a
int *mem = NULL;
4 f! _: R# p+ A$ e
+ X& Q/ g' R0 ~6 \
if((fd = open("/dev/mem", O_RDWR)) <0)
9 g6 V$ w+ u" O2 A1 f
{
. d# j/ i6 ]* w9 _
perror("open error");
7 z- u6 w- M( L& y
return -1;
3 z" w: N5 c0 |& T3 W: k6 d
}
/ ^: c( j' k, U( X7 r/ `
: M. H" c; G, K4 A7 `8 ~! p
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 R c7 U* ?& q& y4 @
. b; X8 v4 a3 v' c3 w
while(1)
+ F, e/ z. u+ V" K3 ^, _
{
0 v7 U9 P& t: w6 S/ u3 C' m
read_MSG_buffer(mem);
) I: v; Q; P. k* \/ J
}
4 J" b* p- p2 ?' P) q% Z' D# R* _9 J; G
}
7 I1 Q8 g0 e6 Z; S. b+ a
; `& p5 R4 |/ f: f" j1 X9 J/ p
void read_MSG_buffer(int *baseaddr)
" j1 f6 C) K/ i7 P; f9 r+ q
{
9 s& Y+ G1 c" ?' A: e8 |, J' _
pRX_MSG_PROTOCOL pshreRAM = NULL;
; B; i: P; V) w7 m5 G
0 q9 K$ [- Q3 l0 ~8 q2 M2 u
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* W; S: \! M3 i
# V7 F t; |' D
if(pshreRAM->packet_cout != count_copy)
$ T. W' m9 H4 M- C% s
{
2 O# N! |: T4 R1 p6 u
printf("a is %d\n", pshreRAM->a);
2 h- n- g% t$ w+ t& Q: c
printf("b is %d\n", pshreRAM->b);
! O k0 y1 G: Q( S+ ^
printf("count is %d\n", pshreRAM->packet_cout);
- w% z6 U m+ ?2 v! i7 Q
count_copy = pshreRAM->packet_cout;
6 S( `- h' H* q) W
}
% F7 V0 s* c7 l
else
4 N+ M2 Z9 p* O6 u1 a
{
a8 e4 V' I9 D% y/ S2 o! N+ y
printf("No effective message!\n");
' @7 u1 i$ |1 M5 J$ z" ?1 ]. F+ ^
}
% {; l# Z' g' c0 @2 X
}
1 p* @0 g+ K% l9 G! P) V1 g8 t
+ r6 J1 k) N7 x$ C. n5 r
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" x, P5 o! C; \0 f* z8 W) Y" F5 d
6 J1 D* W1 L* o# [
+ `3 I; b6 s' c$ K3 g! r7 `/ G% a
/ }( w2 o9 {% u2 D; n6 h
2 Y/ m4 R# |2 q' B9 X, n7 _' `9 ]
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4