嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 Z- A! ~9 h- }7 o
5 @) C$ O: h+ t# _1 a) G
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ m* `' w& B4 ]/ x* E8 E r/ I
#include <unistd.h>
4 v0 Z/ B; i$ X( R
#include <sys/mman.h>
E" G7 O. z( I$ }% p \8 M
#include <sys/types.h>
/ {7 S5 a2 k: ~" i8 ~6 }. Z
#include <fcntl.h>
8 Y9 s8 N; r" s6 R" G" Y
x5 }& \3 N! G# }
#define SHAER_RAM_BASE_ADDR (0x80000000)
. }" I4 u. ^8 u3 }1 k
. R9 ^* T% T" c5 E1 s
typedef struct
: q7 [. K$ U/ b ]& R
{
, R% i+ k2 m* A" Q% o+ \$ H6 l
unsigned int a;
- p' b s& G( o# Y7 z7 v
unsigned int b;
6 d+ F+ L. e' h% F0 }0 l/ y
unsigned int packet_cout;
$ Q. P5 ^ ?4 R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ f# p6 G# V+ @+ p$ c+ X
* Q6 [' e4 p { @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' K( G7 b0 c# }5 ^' L u: m
unsigned int count_copy = 0;
o! Y7 [9 p5 u; m
+ A- W5 |$ b7 `; l
$ d. ]$ P0 T$ a( m
int main()
% B! |4 n2 i! |, p0 `
{
3 E7 j* l$ T+ n
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 j4 Q/ O: d" p0 R+ x5 y
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( q* n8 q: R& F" I. ?- u
% F) w1 K" a0 o4 C1 ^3 `
while(1)
% q9 ^1 A8 B$ K4 d+ G
{
{ n! i& _6 o V) M3 P
read_MSG_buffer(pshreRAM);
+ R1 V( x# A. F! y& @6 h
}
$ l' l* y3 V4 U
}
0 E- l9 T. o9 R6 g% a; ~; x- Q
# v2 J* e) o( }- z* x/ C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* D8 Z' _4 f: L- _+ W
{
/ @5 q M# B% [) E% s5 i! M
RX_MSG_PROTOCOL buf;
3 J" A6 A C$ u& e/ b5 G; i
( k. h2 _$ o1 Y! {, t% Q: x# }
buf.a = pshreRAM->a;
" V M) f' F4 {* q' e8 O+ E
buf.b = pshreRAM->b;
. l+ Z" ]2 z1 j: g' B4 r
buf.packet_cout = pshreRAM->packet_cout;
. k/ Z( C$ w; ~2 W! y3 O$ _3 W9 l
~* |7 b+ s! I/ Q& r
if(buf.packet_cout != count_copy)
( t4 |4 _7 p' h9 l) ?
{
5 o i% S# n* Z9 R4 C4 b
printf("a is %d\n", buf.a);
5 v: U5 m F n5 G; B! H0 x
printf("b is %d\n", buf.b);
- [- l. @1 l( l& _" b" _
printf("count is %d\n", buf.packet_cout);
0 G1 f' J( U* n! I! L7 Q+ B
count_copy = buf.packet_cout;
; g6 G4 v9 t: Q8 M! B5 }. v
}
& U0 `5 Y1 L L
else
! T1 d% r8 Q/ f& J
{
; W% Z/ [6 K% I ~/ l
printf("No effective message!");
8 f2 H4 Z+ D9 ^2 n0 A2 _
}
' [& W" T! ^$ j. w- f: O( I2 u
}
5 [. k4 F" n/ G4 m& n4 l; e0 k
, s+ y) H$ O$ x' K* t8 _
. p2 |( ?' d/ g: P7 }9 K/ D4 P
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& ?1 i+ ^2 V0 A" C
使用下面代码,对内存使用了mmap函数后:
' m+ z a( \3 M5 b$ Z
#include <stdio.h>
+ Q$ A" D" |9 a
#include <unistd.h>
* {. L( Y1 j/ k; N
#include <sys/mman.h>
: m2 g3 a# v9 x$ v
#include <sys/types.h>
3 n8 S% c J H
#include <fcntl.h>
/ j/ i' j$ w. u3 @- ^
$ D( c- L1 ~7 U; m7 i, x1 M
#define SHAER_RAM_BASE_ADDR (0x80000000)
; [( j! q% e& B4 c( A5 B
#define SHAER_RAM_SIZE (0x20000)
: Q1 p1 l7 |& b1 P
* y: [+ E! U0 Q! z& |
typedef struct
' @+ e% L1 j3 \1 m: J
{
! H' l2 Z3 S$ g1 B0 n* ]
unsigned int a;
& g c9 \8 `* M/ \6 A
unsigned int b;
1 T. n" G; w0 k6 T2 \; e
unsigned int packet_cout;
, }. M# v$ T( K3 j" m0 \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' z M, h' _4 ^' c: r+ C; F
" e) ^$ V8 h$ Y1 h& I0 S3 |) e' k
void read_MSG_buffer(int *baseaddr);
$ z% L' ]; J% m# a+ l7 b5 |2 t0 j1 w
unsigned int count_copy = 0;
0 a9 e+ L d8 M& m5 {2 F
+ i+ ~0 T3 O- E' |# R5 U+ y
int main()
) y; A% h/ a# n3 r# E1 n7 F
{
9 `$ U P1 F, ?0 O0 e
int fd;
: K/ o% L8 e' }( |4 l M6 F
int *mem = NULL;
& ~0 t- r3 m: W0 f, |- P
" \3 F, o3 W7 E0 ?1 {8 r9 [ \
if((fd = open("/dev/mem", O_RDWR)) <0)
7 M# w. n1 I/ y
{
, i8 j& Q, M- y
perror("open error");
7 p% V3 M8 F/ |/ G6 j8 o( {$ q
return -1;
. z' g" j/ [& e0 N- p. w6 s
}
; h& R/ \ F/ {! S# C2 Z
4 Y" f) ^" \5 x# T$ F
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 }$ L8 N% e+ s4 ]6 v9 O7 P/ o
k+ y* x- l. ]$ f
while(1)
1 _2 d, `* x$ k; M
{
9 l9 V" l/ D" U- n" ]
read_MSG_buffer(mem);
8 h( o& o6 g# P' D9 T
}
: D) s* W. a% [5 l6 j
}
) c, H' r# c: T4 p0 e& {
' L+ Q. c& ?: @: |
void read_MSG_buffer(int *baseaddr)
3 t0 g( L. f: ?- y$ r% i
{
2 I4 Z( A( f: B3 g# w
pRX_MSG_PROTOCOL pshreRAM = NULL;
' g, U8 C2 z8 m2 J
5 l" j1 k9 n: k6 Y' ^9 P7 J
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; A' A5 |7 m! W9 `! k8 O
! q! k- A( P6 K, T1 v0 B2 O6 U4 v- i
if(pshreRAM->packet_cout != count_copy)
5 k* ?5 a1 `9 J$ I" X6 s8 x
{
( m( S" q4 r: D% e. z
printf("a is %d\n", pshreRAM->a);
* Y2 z# h, h( _. {# E9 \
printf("b is %d\n", pshreRAM->b);
: m# L: l0 A+ F9 N! O
printf("count is %d\n", pshreRAM->packet_cout);
" w3 R) {& r; j. v# B
count_copy = pshreRAM->packet_cout;
7 P( |5 b8 f; ]& k
}
, c( G2 A5 C9 x U# ~9 i* p
else
) L8 q! s: T/ ?
{
& N* o. n3 e( v/ b2 \
printf("No effective message!\n");
; U3 A) @6 f$ O1 F" r
}
' f2 ^) H% F7 a" i9 ]% z& s8 s
}
" s: v' k: W1 _5 V1 Q( E
9 C" m: k3 U \
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ ]; d K+ @% ]1 m y N( }
?8 s! l, ?2 g
6 y$ a1 z+ X0 J v |3 N
" M# c5 S+ D( D3 i
X) o0 K5 ~$ F0 A1 T" j8 Q2 T
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4