嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' X5 S/ w) t6 ^8 k
" u$ K( R: Q" S, A
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ r h! F/ g2 Q! y% Z# c/ Y v
#include <unistd.h>
; M2 \9 o" u4 V: \- p. m. ?; P1 L: Q
#include <sys/mman.h>
2 V8 h* T0 e, m, I( E
#include <sys/types.h>
0 t1 {1 |! j/ w% E1 y% g
#include <fcntl.h>
5 S. C" `7 j y% s# o* n
( E5 M4 K. p$ O8 Z* y
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 f7 P7 u9 Q; R. u& Z/ v; ^* ^
, g/ V B9 X' x% x" ~
typedef struct
6 C) z- @0 N$ E: |& @
{
0 ]% X! s7 B! F8 x1 L( N
unsigned int a;
, K& a! ^4 _5 @' F( b K/ O( {! N
unsigned int b;
6 y+ c4 W& z( Z' ]9 l2 |7 h. o
unsigned int packet_cout;
, D0 i% X( \. b6 A* P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' l$ @; ~9 T6 _+ @& a( s- L
) |/ g; W2 a( r5 P' p& O% e6 I4 {- R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. d( J3 ~; J: D
unsigned int count_copy = 0;
3 l8 {: D( _+ }8 [% s: u
+ S" q; v" M; E1 Q! H
3 B8 H) R0 m4 Z1 O; E5 {
int main()
- ^4 ^$ G3 e% `( p1 h" w* q
{
1 G/ b% ]% O; b/ b/ |, y
pRX_MSG_PROTOCOL pshreRAM = NULL;
w7 p' K3 r# f0 H& \. ^
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 \8 t# v1 @- o* N# f% P( X2 m
. }$ F9 `" ~- c( Z* u
while(1)
& M3 T# P$ ]; n
{
8 \- u* ?7 F) ~* R3 ~2 q' i. P/ @$ T
read_MSG_buffer(pshreRAM);
& l5 P* n' x4 O; ?5 }4 d- P& A- g
}
4 [( ] u0 x% W# U
}
; {% X8 K g9 m+ z6 |+ h! N$ c
" d% O3 D: h5 S! l, J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, u4 j6 f: e2 k# J% I4 b
{
1 u0 D$ b: o4 I( K/ C4 C1 n
RX_MSG_PROTOCOL buf;
5 n) x/ B5 X: _& o
$ w% m9 N! `' m
buf.a = pshreRAM->a;
4 b' [6 \6 ]# g& H
buf.b = pshreRAM->b;
6 q$ ]/ u T& F- m
buf.packet_cout = pshreRAM->packet_cout;
^" r6 ^" S3 {
- r. M* j- b- P1 k1 M- o |$ e% x
if(buf.packet_cout != count_copy)
; Y. `; E) A' E0 U7 [% O! T2 a# ^- r
{
# E5 y+ X( j& Y' o2 w
printf("a is %d\n", buf.a);
- ?, l; R; V- W
printf("b is %d\n", buf.b);
' {) [/ Z3 H' p9 t7 K m
printf("count is %d\n", buf.packet_cout);
1 t. r& d _, j% A% ~( Z- u
count_copy = buf.packet_cout;
! b& j0 K" [' N8 B; C9 L
}
& @) _9 B) K. O% B7 d% F
else
' S6 y G& k6 b9 G! E! }7 [6 K
{
; l* w6 K0 k S; g- `' B
printf("No effective message!");
# B5 Y" X# d- x$ |7 |
}
* o- Y5 F, z. `6 F" x
}
) w& b g. V+ e4 ]* w' J5 l
2 ?( `0 ?- {9 |
, a- I+ ?# z I# a- ^. {7 ~$ a2 C
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 e5 B6 C6 i$ O3 Y2 @
使用下面代码,对内存使用了mmap函数后:
0 K1 b8 k% s5 B
#include <stdio.h>
2 Q0 @1 E/ C. X% j
#include <unistd.h>
/ N+ Y: S" z. b
#include <sys/mman.h>
3 D F; ^5 K5 p' t
#include <sys/types.h>
0 }: J& A) G( C$ R
#include <fcntl.h>
$ m# P7 ]+ G. p1 Q! @
- o3 n4 ?- C& q! ]- c! u* h B
#define SHAER_RAM_BASE_ADDR (0x80000000)
: f7 K/ T: ^: P. {* ?+ z3 f
#define SHAER_RAM_SIZE (0x20000)
) t% Y3 V6 C X7 Z5 k( y% M" X
+ \3 p' b" X( X/ T& Q
typedef struct
" l/ R! p+ r( b2 e* B5 g
{
) d1 H `4 t! d! A4 o# d
unsigned int a;
2 e6 N4 E4 S' E% j% a
unsigned int b;
, X# r# I- H7 ]! N9 x0 D0 k1 h3 h
unsigned int packet_cout;
& Z* ]6 N M: t6 t4 ^. z3 z$ |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& b' o1 P& l4 {, l+ F( N% j) Y# a
- t: j' E9 }* A( a8 p9 r. C
void read_MSG_buffer(int *baseaddr);
- s0 L* r8 o& t
unsigned int count_copy = 0;
6 \6 E3 c) O/ @& x
7 F/ L4 i$ N4 o' M- A8 V9 z* v( w3 q& P) W
int main()
+ A( Y7 g0 |4 I! f2 ]5 b; ]8 }
{
6 e4 D% N* g, @$ |6 Z
int fd;
$ C- B: T$ ~' L& n4 w
int *mem = NULL;
/ ^9 Y) M$ |; x8 F
: w4 { _8 G! j6 |2 Y) v+ v3 m% o- I
if((fd = open("/dev/mem", O_RDWR)) <0)
; `; Z& i7 q+ @5 \8 w$ A4 Y
{
" G% B$ X5 c& P$ N6 m1 l
perror("open error");
' k4 F0 A; f5 {- @6 X2 [
return -1;
! q4 u$ M4 T( a. F! d
}
3 {4 R6 f3 f: m) v/ t h' v
5 M/ H% D- B6 n
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 G( M0 ~; u1 ^; P
4 X9 {" r9 n) l Q. u
while(1)
7 X. \% l6 B$ O$ x; f
{
; B4 V7 W. }" r0 r$ |& B
read_MSG_buffer(mem);
5 \ _+ y4 {7 u
}
$ P$ f5 R% c: w' \
}
) ]1 x2 S9 U( O3 _0 z a7 p
+ Y3 m% `* }' _8 e: ~2 r
void read_MSG_buffer(int *baseaddr)
% f. o$ d0 O8 G, R
{
! X( L9 C+ v" I0 \5 [
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 [! N/ x; C/ |7 o
" O: a% _" z F6 V' N' n- w
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! }$ B: L1 E2 Q. y7 b H4 d
$ i4 N- S0 A- x
if(pshreRAM->packet_cout != count_copy)
6 ^! n" s5 O# X* E3 b o7 g& V
{
+ Q5 |! r! k5 w1 o
printf("a is %d\n", pshreRAM->a);
t6 y: L" g2 E
printf("b is %d\n", pshreRAM->b);
2 s; V* B7 T; K4 H1 k
printf("count is %d\n", pshreRAM->packet_cout);
- @' s+ w3 g7 r0 m
count_copy = pshreRAM->packet_cout;
3 T0 z1 K, k9 y: v3 L
}
1 S$ \% P r, c% j8 `3 {
else
* w0 a2 x- T$ J: I$ q9 p4 `
{
- O. G& w+ B+ o
printf("No effective message!\n");
+ `2 M* R" z8 O% i9 a) E
}
( g1 F6 q I9 t1 e. e" E
}
' y$ k- e6 b) I4 V" E
( [: E1 ^) s8 @3 K3 N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& X8 |0 ~2 x& ^ M R5 G
* X0 W9 V- i+ ~0 T6 L% O
, c' o# h1 E( _, Z% f3 P
8 |: {% b0 Y9 P: Z4 P
. o' [% q. s; n/ V- S
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4