嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 Y! Q; n* H3 f: X! Z5 {, N
* I, @) _. a }4 S4 G7 c& O0 ~* X
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% t' e$ N4 U* n: L% H, t; r
#include <unistd.h>
. l9 U/ B8 S$ X
#include <sys/mman.h>
2 ? v: ]. h/ @2 c
#include <sys/types.h>
( x% b+ a; ?0 O
#include <fcntl.h>
1 y" \, J0 m3 Z' r0 j2 s
6 }2 s9 b t* ?7 p: @2 B) e
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ y4 Z3 _+ y2 I9 T8 M/ H) n
, A8 o8 |3 b/ x% [* L
typedef struct
' D5 ^) o c1 M+ v9 q
{
/ K( ^! M& U. b7 y/ W/ |
unsigned int a;
, j4 l" f2 p/ F! F9 f
unsigned int b;
$ E% S) P& c9 V) \
unsigned int packet_cout;
7 Q6 h6 N6 i" ~4 p1 N# i4 R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 a; G& u- S& t* Y; P
. O9 b k$ u9 l& x1 {' \3 p3 ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ m- G( I9 |8 ~8 Q3 J
unsigned int count_copy = 0;
; Z. a9 V' i1 v7 [2 Q8 P
5 @' o6 ~: B o% l
8 ?0 _3 t: k% I. J/ ]- M
int main()
5 w! P, w- a1 V4 `
{
& Q1 q% x o8 K6 ^- g
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 q1 B( i( P0 `+ V
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: I8 V B# ?- t8 Y3 R; I
6 U: y0 T% `8 l+ N' H+ }
while(1)
7 ~6 Q' E- Y2 J) F" S( L; t# g. m: C4 o
{
z. b: E9 |6 t# E3 q/ z& f; t Q
read_MSG_buffer(pshreRAM);
p6 O) k. f( v( a* z
}
, F6 [. s) C6 A, l
}
+ u H$ |' V- J1 w" f, ~
; V k( y3 z4 ]) c8 I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% W$ S( n. V1 F2 i5 h" X: p( E, C, x
{
3 V0 {- x7 O* O; r2 E# E
RX_MSG_PROTOCOL buf;
, T# k( S; R: \+ @; y! K
! N! n2 e- T( T) Q
buf.a = pshreRAM->a;
# v( V3 l: x0 G1 R7 ]' K5 W% L
buf.b = pshreRAM->b;
, w! W9 }& Y |2 b! L* f) _/ R
buf.packet_cout = pshreRAM->packet_cout;
0 T7 a( s4 X0 `: v- B# ]& w
1 j, E* m) o+ v
if(buf.packet_cout != count_copy)
: ?1 ]. ]3 A5 T& M5 J* Y
{
' i9 @' c3 n* |- e+ S5 ], v1 B0 ~" ] @
printf("a is %d\n", buf.a);
4 \ g* M2 K, P& m3 l$ ?& a$ I/ R
printf("b is %d\n", buf.b);
1 U' f5 u/ s) P# i
printf("count is %d\n", buf.packet_cout);
' o& c0 ?& ]% e+ b
count_copy = buf.packet_cout;
4 ?9 m3 ^& k d/ W: P
}
# T8 |$ r" q* o7 w8 A
else
7 t" n+ @) w& J6 s* q
{
+ Q! [" W, D% a/ s7 U
printf("No effective message!");
- h. A; a8 X a8 t( t6 m
}
0 i# B9 u) N( S+ t' O5 Z. k
}
2 z* }; Q$ V7 d4 T5 e5 k# T
; o' Y) Q/ y' k8 T* ?# F f$ x
# S$ g/ ]( q* X( U# ?% I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 n* n7 ?' T8 e [* ^
使用下面代码,对内存使用了mmap函数后:
6 W/ Q! h2 G# s8 b3 S: t4 [
#include <stdio.h>
* f+ \( E c z# o1 @8 L
#include <unistd.h>
" `5 l1 `7 W7 x
#include <sys/mman.h>
) _: A& h7 [5 e
#include <sys/types.h>
$ o. U2 ?; {7 O: s1 N9 A! o- F7 \
#include <fcntl.h>
5 d% u d3 r6 P) \) w9 C
; k( _+ E9 J9 Z E
#define SHAER_RAM_BASE_ADDR (0x80000000)
, E9 B/ U. j2 U8 `
#define SHAER_RAM_SIZE (0x20000)
* t" Z0 k/ L0 Q
) K& _- o( g( @8 @& }/ Y- X
typedef struct
6 K' F# n: w9 R- f: W( W2 l8 i
{
2 J4 z8 X$ W" ~8 @8 K) G$ O+ b
unsigned int a;
; n1 e; z7 {3 C$ L( ?- I
unsigned int b;
! x4 j- N0 u2 J' U9 ~ E$ o0 H
unsigned int packet_cout;
+ s3 u0 s5 }' j" V5 ]9 W G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 S% _2 r! P+ o/ W- i
- Q) c l/ ^. |8 @- ?% ~7 h' S9 {7 v
void read_MSG_buffer(int *baseaddr);
3 P2 c- L. s# p6 f; J
unsigned int count_copy = 0;
; R/ ]6 i: i% i1 @* f' w; G5 I7 ]
9 Q8 E2 ?* V) ]: g# v
int main()
/ K" x8 a& C0 @7 p; B, }) k2 K
{
7 ]* }2 k, W5 D0 L8 [9 \" z0 c
int fd;
3 k, x, Q M$ k4 [2 ~
int *mem = NULL;
+ g0 B- O* N/ p$ i! o: I& x2 B
, I+ b1 z, }3 Y$ M
if((fd = open("/dev/mem", O_RDWR)) <0)
$ ]6 M& H, W. L m
{
- H( h2 L: D B u4 t7 D
perror("open error");
1 n9 c/ B5 |) l8 ]' d) Y9 U
return -1;
6 ^' C+ |4 e% e1 U6 F
}
9 C% [6 ~4 |# P& R6 @+ |8 N8 b6 d
; r$ g2 O5 W' q$ W/ N* Y7 u' G$ A
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 ^9 e- {/ E' Z: Q
! K0 ]* ^ {4 b4 x
while(1)
8 O& v$ A { G# y+ H( @
{
* {& N# B0 Z; S( I0 j
read_MSG_buffer(mem);
% z9 W s: t6 ~# \5 Q
}
2 y) M. S5 J6 K
}
9 u7 c* X# x# c
; u" g! i; d4 n2 ^+ s6 p+ u0 o: v
void read_MSG_buffer(int *baseaddr)
9 T; K$ B& _7 k% G! k$ N
{
9 B, Q' T3 n6 C
pRX_MSG_PROTOCOL pshreRAM = NULL;
) V2 p0 b% g+ S. j7 f
~. R* s( _0 b, p" L
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, R8 @$ k w- n& r
- H, J( H( Q8 P1 F5 P! P' J! X! K
if(pshreRAM->packet_cout != count_copy)
7 a+ s3 ~0 ?' Q. ^
{
8 b: K+ V" ^- X
printf("a is %d\n", pshreRAM->a);
5 t/ R( j7 ^9 `7 a/ N
printf("b is %d\n", pshreRAM->b);
* p4 W1 I2 d6 C! i
printf("count is %d\n", pshreRAM->packet_cout);
: B: s9 z$ x7 J( ]+ @( v! o
count_copy = pshreRAM->packet_cout;
7 m; T, p9 I6 [; N$ H" O7 d
}
! s, Y4 [8 o7 o: U& _( P
else
6 h* h; `' R, \
{
( a! w9 A1 K8 z1 `$ N1 i
printf("No effective message!\n");
9 n9 h; V/ B; U
}
; v( K( X5 F( @ I
}
8 o2 E, P! Z. s! i! z8 i
\; e1 @2 t" ?* l! J; e
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 d9 K* @7 {3 F2 \7 |) _
& }9 S9 A1 l# ^# ]. v
6 \: t+ w8 [ R6 b7 X5 R' v, n
. o$ V) }1 ]' H4 G. G9 |8 s! ]& K$ w
- Q0 a. a7 c( [3 k$ F
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4