嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 L x5 h' A- K$ J
; W. {, R! j" D9 }3 l# l+ w4 P; c/ G
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! k7 M2 J Y; t6 N5 v' T; ?2 ^2 m
#include <unistd.h>
& x0 O: } c- x( i) m# s/ g
#include <sys/mman.h>
+ O/ Q( [* W5 Z: v, k b
#include <sys/types.h>
& R8 h( _" K) ?
#include <fcntl.h>
) p& T0 r z" A8 P* V2 p
4 c( D- b% ?! l! C) D, e
#define SHAER_RAM_BASE_ADDR (0x80000000)
" f6 G# x( T! ~0 I6 C
* F" [ I# Y G
typedef struct
5 X) r* W2 A! O& A* B2 O
{
" Q' m4 u8 Z0 A! c
unsigned int a;
& s5 Q* S3 u: k e9 }8 B" U: d
unsigned int b;
& s$ Y2 C" B0 R) d* N& C9 K
unsigned int packet_cout;
! @+ w; C7 q0 w" K g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. v' U; b+ M2 E
9 l# T1 i. \+ L/ {6 z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( v; }: y" k% |
unsigned int count_copy = 0;
4 G/ f1 z' p. P) s3 O
& d$ w6 C+ O5 h
( z' H4 L' Q H
int main()
8 B( x( }5 y9 {8 C
{
/ R) N8 C4 N. D
pRX_MSG_PROTOCOL pshreRAM = NULL;
: b& h3 G3 {; F7 t7 D
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& d8 T/ ?6 r# l1 e0 v: |" d+ {2 R1 Q
+ O$ H8 O" A" N
while(1)
6 W# L v( a* K/ w, ]
{
, P, M" P: P, a) N- b
read_MSG_buffer(pshreRAM);
; \( t2 o4 t- C3 N D. |' w9 P
}
2 u8 a; L9 n6 @
}
- N9 g: L5 e" R+ a5 _$ M( |
6 c( `" ^5 `; [% y3 s& q8 s' H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 J8 b4 w1 ]$ h6 K0 [+ l
{
$ p K4 \% w; ^ g1 }
RX_MSG_PROTOCOL buf;
7 Z# W! c6 g* X B
3 X2 o6 [6 H& R9 R; `
buf.a = pshreRAM->a;
8 \# n3 A( ~& g5 [/ V+ j5 ^7 C0 N
buf.b = pshreRAM->b;
9 _- h- P/ c, f Z+ @3 y/ c& C
buf.packet_cout = pshreRAM->packet_cout;
9 v# H, L3 x$ g. |. G
2 e0 @' h: _: [: K
if(buf.packet_cout != count_copy)
, u0 j- B7 e6 r# H% ^0 V
{
) V8 r$ ?# m! o! W
printf("a is %d\n", buf.a);
" B. a9 J) O* c" |; Q! Q2 a# M
printf("b is %d\n", buf.b);
" K: ~* l w2 e: o$ F1 D
printf("count is %d\n", buf.packet_cout);
$ f z7 k, z1 \7 `8 l
count_copy = buf.packet_cout;
' \9 l: w% Q4 k& r+ W( c
}
2 }$ i3 L4 {7 ^, A7 w' d& ~5 Z
else
S, V: Z' u* P& d+ n
{
+ X& F9 r& Y, f* K
printf("No effective message!");
0 y6 ^! K" h+ i% e' {
}
/ o8 L' p: L: |7 y
}
0 z: ]1 q8 ~2 ~$ a2 T
) |/ _( O5 k. f; ~
4 f3 l' U0 U8 ^: }: }7 ?) p
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 H% Y$ ~3 l6 Z; F5 @; L
使用下面代码,对内存使用了mmap函数后:
" P" U7 U$ e7 ^/ B1 Y, p( o
#include <stdio.h>
/ G5 b, @- y: y! J% G3 Y$ n; ?
#include <unistd.h>
$ p4 ^) Z- `! n7 a& c3 {; n
#include <sys/mman.h>
# N% v4 u% k; L; `7 C. h
#include <sys/types.h>
* z+ m/ {& _4 z' {* `9 u
#include <fcntl.h>
/ D: D( r4 u. I
) W) ]4 D2 b( G8 ]0 Z5 [5 \
#define SHAER_RAM_BASE_ADDR (0x80000000)
& x" r) m; m O) l' }' o
#define SHAER_RAM_SIZE (0x20000)
" A# d4 r: ~/ r$ A+ |
. m7 k) i$ D2 N2 N' o/ A
typedef struct
9 U. b8 S1 ]& Y" f5 O# E
{
" q8 A& z5 E9 \, P7 j' b4 ^' j
unsigned int a;
8 d1 a- T. u# O3 I
unsigned int b;
" `# D7 R' D$ S- O7 R4 P
unsigned int packet_cout;
" b* Q5 M4 T; Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ n- P8 L7 V8 l/ ^* p) g. u; l" _
( h7 j- S0 ?: J/ x
void read_MSG_buffer(int *baseaddr);
2 M4 k5 o& | @+ n0 B/ j
unsigned int count_copy = 0;
! O- t* x3 i. [, A( H* _
5 D+ o5 g/ N9 W `1 t% K
int main()
, d. N- l5 Q, w( r P
{
' f% [ M u. i) g; n" a
int fd;
: _* w* s' }, T# w6 z' x: ]+ u# C
int *mem = NULL;
; E/ y8 }8 ~( O4 \& u8 z" J; O
$ D, K- Y6 [9 g+ ~! O2 e' |
if((fd = open("/dev/mem", O_RDWR)) <0)
* v( o; `1 `4 Q: X' U" H8 ~% H& m
{
8 P5 y4 _, _5 J% ]$ e# m* I
perror("open error");
! y" [: l# _$ z
return -1;
/ u( j$ F4 n; e$ d1 T. |
}
* F6 n7 F' m5 |6 b [
3 _+ N9 T3 u' C
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) @6 E7 u! y6 v+ P
n, B) N! E6 L
while(1)
1 v$ N1 s8 p2 S# s' ^7 g
{
' F9 e9 r- |+ i1 A( w* A
read_MSG_buffer(mem);
" X7 b* n& L% d
}
; a8 z0 m0 l. f: _
}
8 S: v: e1 y* A, ^% [
1 Q) L3 I7 _2 M5 Y
void read_MSG_buffer(int *baseaddr)
! J- v+ B) @$ Y
{
& v6 M# M# E* d$ w
pRX_MSG_PROTOCOL pshreRAM = NULL;
% U) y$ F% j3 J6 f
( W6 ?' \3 p3 t
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( d5 j. n2 ` Q/ O3 L6 f# E
N" F* ^$ b1 G/ s# H, h
if(pshreRAM->packet_cout != count_copy)
; J) s/ t' q1 z3 k; l5 x6 d: |
{
9 c- ^ h- h: \
printf("a is %d\n", pshreRAM->a);
9 v' \8 l/ e1 n2 ]) j8 Z
printf("b is %d\n", pshreRAM->b);
/ z$ z) G6 H3 y$ Y7 ~
printf("count is %d\n", pshreRAM->packet_cout);
2 a3 x |7 |3 L. E3 Q0 R
count_copy = pshreRAM->packet_cout;
& f6 B g; v- l3 N' e; S+ V3 H
}
9 C' U) ]; v7 q6 w5 j* K
else
1 [/ O$ r. v* a* K0 i, L" r
{
$ l- ~- B: i: k+ f5 |
printf("No effective message!\n");
: R P, N+ A3 y* v& M
}
; l ~: R! G, I' F1 L; E1 C
}
! D8 L4 D! L4 ]$ d8 y
& p: W( c. d [$ l3 r
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- p' q+ r5 T2 v$ R2 ~7 U0 S; I) z
6 o$ b1 j" z( t' K }- n
' ~0 q; v+ w/ H$ }" q5 y
! s% W5 m: Y- H& [* U3 l
0 ?9 r/ n" D5 u8 X7 X3 N) r8 a
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4