嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: O# G/ a$ p6 a: W5 E* t
, Y! ~+ q: z6 |' `5 d! G+ M+ h, w1 e8 _
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ E# N( ?4 F8 L$ v1 M+ P
#include <unistd.h>
+ ]8 \) ^' h8 d
#include <sys/mman.h>
) K* V7 ~' N* y3 L. h
#include <sys/types.h>
) Z: t4 q; S; {5 N k% B) f7 V
#include <fcntl.h>
$ D; [, _% P4 r' H& g
3 n) e) s a- o
#define SHAER_RAM_BASE_ADDR (0x80000000)
: [0 [) Q! u9 }& f
- G- l4 v8 h0 Y" ^% ~* C# E2 C
typedef struct
4 T$ [$ a! n& r" U0 [ j& o& b
{
9 h o3 @ Z& q
unsigned int a;
! Z. \6 {, q" ?& C' p9 q0 Z
unsigned int b;
% e! v6 V' d0 d t* Y# ^
unsigned int packet_cout;
6 @: i! t% r; T/ _: j" r; A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- Z1 \( T4 q1 U" E1 z9 O: c; e
, Y$ u$ u5 Z0 R% N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' Y* a8 [6 z+ h' a7 f
unsigned int count_copy = 0;
0 g7 z- I5 j$ W" }; u4 l: K
! J0 B3 M% H7 Q+ k- p ]
+ f; `2 W+ d8 K: J; g2 v; m
int main()
9 S/ c* i$ q. D: z3 ]# ~# n& b" o
{
& {' V6 ^: F7 j/ S, ]3 }4 Y* T% n, w' _
pRX_MSG_PROTOCOL pshreRAM = NULL;
: e+ J% a3 E# X
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ R9 B6 t6 b5 c5 f0 l
8 y( |5 J, y- x6 H
while(1)
% W2 z5 O) U1 K) H& F
{
0 B u: x6 n# r* U) Q. l
read_MSG_buffer(pshreRAM);
( C z( `) O9 _: J# Z
}
1 a3 q1 @: @ p( ?$ t. G( D' k
}
4 }$ V7 t; `0 G/ u
: @) J/ f( c9 c) t3 q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ \1 D5 n# T9 u9 \
{
& u& d7 H; f1 ^, F9 R8 M
RX_MSG_PROTOCOL buf;
) M& f$ K+ T, T0 B" L" d0 s+ u
, [1 z( U7 p, I2 ]
buf.a = pshreRAM->a;
* c+ ?7 `8 O2 y2 Z+ \- z
buf.b = pshreRAM->b;
% `# x4 e0 G5 _
buf.packet_cout = pshreRAM->packet_cout;
: K8 _( o0 o0 x
# k2 E: g) ^9 N" T0 G4 {/ e
if(buf.packet_cout != count_copy)
" V/ g7 [# j4 s1 T a
{
1 g e5 R. P/ h4 }
printf("a is %d\n", buf.a);
! D9 Q9 {* d$ B1 g
printf("b is %d\n", buf.b);
1 I9 E' y# c* j* n# m
printf("count is %d\n", buf.packet_cout);
" ~4 N8 q$ \4 L
count_copy = buf.packet_cout;
; n, ~! ^: y1 n ~# Z
}
1 v) d8 f# {! b7 `" Y5 y, V. P
else
$ E6 C, v4 Q% v7 S$ M* t
{
* c" I# k. e5 l5 M# U8 E
printf("No effective message!");
" e' O# N; U$ B3 [& t" v
}
# r$ b/ D5 |2 y6 M6 \0 a
}
4 B6 _- o0 z, t
+ g/ K$ p3 S) U7 F2 m. s
9 f+ i, ^: B2 s% z z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; m5 u$ u+ e7 R( ?
使用下面代码,对内存使用了mmap函数后:
5 {3 F! ^& u" z) f
#include <stdio.h>
* G& [+ U0 g% |' m/ L; m* U1 \
#include <unistd.h>
; h3 F6 J) r' z5 p9 v
#include <sys/mman.h>
% o% x3 o7 m- x. ~ g. q; U/ Z
#include <sys/types.h>
x% b) ~; w( ^/ p* M
#include <fcntl.h>
$ P! Q) q( }% y1 [/ k
) }9 i9 k. O6 m, o/ R, F$ _
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 N; B8 K0 i; O5 v+ H, l
#define SHAER_RAM_SIZE (0x20000)
+ L7 I# E+ M; x# x* n0 f4 ], E, M
# e5 R$ _' A& E
typedef struct
" b, n8 {1 N) c. Z, o2 z' d2 \
{
- c4 {& D- y! @5 ~; U0 p
unsigned int a;
. G# X# ]$ y D. o' o/ _. C/ f
unsigned int b;
6 H0 ^! w" s+ l& a0 C
unsigned int packet_cout;
6 a. E3 V0 d% X2 l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 x3 T9 S' Z; r+ C3 Q5 R5 u3 `* d
) ]# Z' T$ X+ `8 O$ o+ P5 h8 w6 ]
void read_MSG_buffer(int *baseaddr);
# f; K) W7 u+ u$ c5 u Y
unsigned int count_copy = 0;
, n6 F' x. \+ t. p5 Q, y2 [3 l
; J$ y D4 L1 R) v/ E$ X6 ]5 c6 d
int main()
z' P" r- u! z9 ]
{
5 [. U( h, g! I; H# z* c" ]; p
int fd;
; n8 Y; a$ H# w$ E, D
int *mem = NULL;
) F+ N) N- a( a1 x+ ~
+ A, {% y: Z' S" Z7 v5 n; J" x
if((fd = open("/dev/mem", O_RDWR)) <0)
0 B. I1 A% @% a
{
3 Y6 ~" a/ @6 k4 [
perror("open error");
/ s( z, U$ k! U
return -1;
4 `$ g+ i, P% T, H1 u' ^4 g
}
" n! ?, l. s/ J) v+ z, ^. p
: }; S+ |! g w& g6 Q( m6 q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- M% W9 a# N6 F* P' a5 s9 g- y
5 ]8 t! w) {! J5 e: z
while(1)
+ @$ Z5 {0 ]) w3 ~
{
( y9 m( k' r+ ?2 c
read_MSG_buffer(mem);
+ X/ `/ k2 J* \+ W
}
5 J# r6 a: j& c6 b7 l! A2 G: G
}
& o, P; o/ |8 l/ J# v
1 n: n5 I! P! S
void read_MSG_buffer(int *baseaddr)
- y/ t0 x0 u% a2 K$ g9 c, J% k
{
+ T9 ?4 I. G! b, O9 A2 Q
pRX_MSG_PROTOCOL pshreRAM = NULL;
% F6 M6 s: @7 ]- S' H6 [9 K) ~8 n& R- |6 z
E/ y [ B! i# s6 b
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; X% O/ W/ x! X1 m9 R
' }- g+ H7 r; b1 ~
if(pshreRAM->packet_cout != count_copy)
* K, d0 u4 M i" @! N) p8 `
{
, F9 F8 S X9 L2 ^$ U
printf("a is %d\n", pshreRAM->a);
3 W: J; Y5 P& Y9 P0 ~
printf("b is %d\n", pshreRAM->b);
& C0 a! p4 p8 _; D5 i2 c
printf("count is %d\n", pshreRAM->packet_cout);
0 u' v4 }. Q: B G2 u7 K" g
count_copy = pshreRAM->packet_cout;
- k; S! N* [& y& K
}
8 {! b4 D( f" i; _4 ~8 c. Y
else
; G* w F( O4 y1 ]- g% h
{
6 {; s! p9 y! h d: M
printf("No effective message!\n");
* G, x3 ?6 L2 {7 [, |# t0 e
}
l4 X* l, i; T* v# h
}
+ D& M4 Z& L) P# i& ~' R9 h
7 c, h( l3 ^3 Q( o7 C) j
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 I! s1 R& f6 a* Y
/ t0 S C. x' d: P7 V$ R
& i( g) O1 k _+ W- b$ D
$ X! d/ A1 {8 R( C! T+ |6 t( P
" }. j- ]6 V T$ Z* |) a
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4