嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
W" u* \0 \0 z+ m, @
# r: |* y3 r* w! Z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: o# N7 e' g0 {) h
#include <unistd.h>
( `, j5 R- ?6 e( {$ A3 Z
#include <sys/mman.h>
- ]; `# t) N+ t
#include <sys/types.h>
6 b/ Y# b" a0 }% X. W
#include <fcntl.h>
0 q2 e! M1 Y- v) }5 ^
2 _3 r" _+ O; {* L9 e
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 J7 Q6 X0 k; v* }- a: }+ I
* ]4 p5 k+ m; r7 R# p( ]( ^1 E$ l
typedef struct
5 _0 q& A" ~ y
{
$ ]! W( Z T; y% G( Z& j$ Z
unsigned int a;
/ ~& B$ ^4 [$ p$ }+ Y. b
unsigned int b;
& r# ]- x% Z% r& s- c' R
unsigned int packet_cout;
! N6 t' P) f; V$ [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 `9 Q4 O6 y. I g! i
8 T# d& E# }6 O3 Q4 N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
^2 _4 b1 }$ c3 D$ R
unsigned int count_copy = 0;
8 [/ E$ T4 ^+ w, ]
2 }& e* y5 w2 P5 l1 L
' l* c4 E( X) }
int main()
* X! G7 p a7 k A" _2 h
{
, u$ }' v1 N% A0 T
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 Y; I) x* T8 j6 S) x
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
' {( q a' G* l
: F' R! ~4 d5 L. W9 W: r2 n8 w5 D
while(1)
, c9 b" t& {0 i: d# u4 Y
{
* [# z9 R) p7 e/ j7 T
read_MSG_buffer(pshreRAM);
6 S. ~9 c# B8 Q
}
' r5 k$ ?- \: o6 Y# Y b1 _
}
, c! C4 `4 R! a! a% }6 Q8 C1 [$ P
: L# u$ E, F- I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- D9 o2 d' N) k2 O
{
0 C* ^6 }: v0 @
RX_MSG_PROTOCOL buf;
) H: y% ` F) h$ J% R, v
9 M' \; Z$ O& t5 V! ?
buf.a = pshreRAM->a;
1 Q6 N: ~) t Z6 D/ O a( f' V& @) I A
buf.b = pshreRAM->b;
6 [& v8 ]5 S6 T* T
buf.packet_cout = pshreRAM->packet_cout;
5 g+ q) s2 d' F% t8 z; k
0 H: \- a# H* |* z% r$ F) e
if(buf.packet_cout != count_copy)
& Y/ e N2 x4 B X9 y3 p
{
5 v6 f5 y4 z& M( \+ n
printf("a is %d\n", buf.a);
. |+ w- ~9 \, Q( `9 J
printf("b is %d\n", buf.b);
" i% V" z. r# i% w. Q
printf("count is %d\n", buf.packet_cout);
$ P# N7 e, Y! b
count_copy = buf.packet_cout;
' _* J) x2 t5 @# T: I+ R
}
# I8 w. [0 U5 C( z/ Q# B) m) _7 {4 Q9 ?
else
. l, q3 @$ I3 n) L+ o) n
{
$ t! Z& K4 h( {) Y7 }' P: G
printf("No effective message!");
4 x1 u ~3 Z% x# g2 v0 |
}
: |: w0 i! X) p8 _4 O+ M) c
}
! z7 g+ K/ F+ @% Q: n9 Z" M, j
/ e7 M9 N" _2 Q& m0 l% F
+ \- @3 ]7 j; Y: e/ T$ h6 \. {
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 p2 L3 F& {' S+ J, Y; ~
使用下面代码,对内存使用了mmap函数后:
- }' ~( h! p* T* o1 e' B
#include <stdio.h>
- B* H2 S- v" w
#include <unistd.h>
2 `1 C3 U6 H0 ^
#include <sys/mman.h>
3 u K( d# K7 S) h- o/ Q
#include <sys/types.h>
; N/ x, X2 ?. Y7 u" e
#include <fcntl.h>
( U K! `" m3 [1 D2 u
- y1 d) Q6 S @5 ^" F6 G
#define SHAER_RAM_BASE_ADDR (0x80000000)
* o: V3 Y: q& E- y
#define SHAER_RAM_SIZE (0x20000)
1 i) R0 E. ^' q2 G7 b- F
! Q+ i0 F8 M/ j$ u& ^* n
typedef struct
" f4 U. E9 k: e! Y5 J
{
! I7 K; h6 @5 ~5 m
unsigned int a;
& {- q4 X0 c% h3 `$ O6 z# B
unsigned int b;
4 R5 f& C( d8 N& i4 b
unsigned int packet_cout;
* ]: Q1 G8 Q/ w }0 E" y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 O2 \2 L7 w D# h: T0 K
" M$ Q' ^+ S+ j# B' ~* }
void read_MSG_buffer(int *baseaddr);
- Y& _3 R' _ M: V+ J1 n
unsigned int count_copy = 0;
1 E& l* J3 I$ p' S8 g+ {, K5 r
: F+ n/ j: u$ @, U
int main()
: h; v+ i: m, S
{
* `" @( k9 @4 p R0 v
int fd;
( o5 a; A9 k- d8 f9 x( W( w
int *mem = NULL;
n3 b! ?3 L( u4 e* d
: P, U0 g+ H; ?, w; e8 J; V; j$ W' B
if((fd = open("/dev/mem", O_RDWR)) <0)
9 p" e9 Z2 o+ R$ c5 @( z0 v% o
{
4 b ^5 E2 A& R1 a
perror("open error");
% W h* ]* i) Q
return -1;
( t$ }- V- M2 H/ l" Y5 s. z
}
! k- Q' p/ D! ?" t% j. V
1 u% v' Q+ \* k9 v
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 [+ V/ l2 ]* f
: ?$ F l, p- j$ R5 Z u3 t
while(1)
& `, S" L" \9 g1 W: `& Y+ V
{
9 K% v$ f5 {# F7 v* a8 ?
read_MSG_buffer(mem);
/ ^/ k8 k/ k) |. R5 H ] a8 Y& I9 m, f
}
+ j; l8 S: \+ l0 P8 L$ \
}
+ {8 c# H+ y4 g- }
0 u" t0 }' H6 m3 C- z5 q
void read_MSG_buffer(int *baseaddr)
: W3 e! `% t5 G4 A0 o5 ]5 z3 a
{
F1 ]# R# @* v0 N0 X! t! ]
pRX_MSG_PROTOCOL pshreRAM = NULL;
* G' d$ i8 ]; ~ B' d& r7 h7 d
( I# ]. Z+ u8 a1 Q9 a3 a1 \
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' k- g1 V' e7 w/ P
/ `3 g& K) b* x( a" `- O( `
if(pshreRAM->packet_cout != count_copy)
/ L7 V. J) `6 b! W8 }& o0 U( v
{
) G k& d" F, q( S
printf("a is %d\n", pshreRAM->a);
7 `/ Q# Y6 g/ O* n
printf("b is %d\n", pshreRAM->b);
: N \/ S5 i; k( o6 K+ T
printf("count is %d\n", pshreRAM->packet_cout);
% N4 n, ~7 b8 p; m8 k
count_copy = pshreRAM->packet_cout;
3 n$ ~, o! {+ D1 [& J5 D7 j8 S
}
$ r& _! L+ \% P$ J4 I0 U* z4 d3 q2 X
else
6 F. j! {6 @" [2 u
{
' V' q( X+ ?; m# t0 B9 L
printf("No effective message!\n");
5 N" d! y# `. u3 t1 X
}
7 ^. a2 b- o e V7 K0 x0 e( g
}
0 i& Y0 [) B2 P: ~( V
6 r0 c; K, i3 D; ^1 s0 t0 g7 d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 L* A/ j7 a8 J! y
- w# F1 i, K; `6 _% P8 U
4 Y; Y* L3 Z( |6 d4 l+ y
7 X* W; T9 a8 I6 { z% Y
5 |4 _. x2 ~. [* ^- B! ]
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4