嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: s( V" w! p. k3 X) c3 X0 `
7 O! M: D! [. z" q* w! e" g# _
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, k% O7 Y' E9 K3 e3 A. ]( q9 a4 q
#include <unistd.h>
4 W7 G6 w( m G) |% Z% e( n. S4 M( R
#include <sys/mman.h>
$ v! J* ~7 e! W7 O! ]
#include <sys/types.h>
# g7 j2 Q& a0 j( p: k5 B/ L4 Y
#include <fcntl.h>
# x& n! d) z& [% \' b
: Z8 n; w7 }! T! M
#define SHAER_RAM_BASE_ADDR (0x80000000)
: N" l9 c1 S% M) {; E l
8 ?" ~8 A& N/ v7 ^
typedef struct
$ \$ z& }1 r% W
{
7 T2 b! [0 _3 {- a
unsigned int a;
7 n# `5 z: I0 @' z3 T
unsigned int b;
- I( x2 y0 s7 j- z8 z
unsigned int packet_cout;
* D6 e; l/ J1 l0 X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 m" @* ^& U }* a/ l( P9 p
% n+ _/ X2 p* o! C' s. s1 h6 B! o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. U: e+ H2 c o
unsigned int count_copy = 0;
- |; C! a2 {( t) J
9 v8 y# Z! O4 Z
0 d! {: i3 L8 ?6 J6 Q! s4 k
int main()
1 \9 `; L" @6 y* i9 C- d1 Z
{
/ G) Z P6 d' W: F. o
pRX_MSG_PROTOCOL pshreRAM = NULL;
" |6 o% H& r+ D
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& [/ u) t3 r8 W) M; X! i
0 q2 E) U) R/ j" V
while(1)
/ |6 C- n) G; e; ]- g% c. v% F
{
7 O2 F4 [1 V+ D K: ]& }+ o5 G
read_MSG_buffer(pshreRAM);
! x, i& `" T/ n0 Q' k
}
+ s/ m' {' f6 D8 U
}
! {% J% c) Z Z
( K( X% O- C: x# |$ P; c! |* K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 W0 ^. h. y; i5 L& K* O
{
5 f( K4 H; j* H; h! @8 Q
RX_MSG_PROTOCOL buf;
+ F, a7 N& ^ P1 L+ x* Q4 |5 q9 T
- w6 d5 s1 _! m" c& u: e
buf.a = pshreRAM->a;
5 k# Q( M1 D/ ^/ z4 J0 Q
buf.b = pshreRAM->b;
/ @" U' G5 |1 m
buf.packet_cout = pshreRAM->packet_cout;
7 i6 }6 n" [7 n" r. A; b; x9 Z
9 P9 u& b0 q# s o! d w9 j/ H5 K
if(buf.packet_cout != count_copy)
3 w8 V6 X b, U0 b+ N% t
{
5 C( g/ }$ s6 s: X
printf("a is %d\n", buf.a);
: }9 }0 ? G1 R2 P. t
printf("b is %d\n", buf.b);
3 i8 `4 C2 T6 s7 U
printf("count is %d\n", buf.packet_cout);
7 l& Z( P9 g# f) P. R7 V0 V
count_copy = buf.packet_cout;
9 H+ k6 x; }6 D c
}
: s9 ^9 e! e9 i4 F a/ W! e
else
1 F& Q% y1 ]% L) p; [* i# M
{
. i+ j6 J9 a) E) I
printf("No effective message!");
7 V% \2 c. S8 O6 s$ ~
}
, [3 K) R6 {: g* k
}
* F1 B( n% ?$ M
! t5 x4 @1 z8 x, d Z1 ^5 \: i# ?& x1 k
; m3 B& h; V; ]# w+ m0 y' h
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, Y& ^$ _, t7 b( M, e. i: M$ V9 Y
使用下面代码,对内存使用了mmap函数后:
! x+ [1 _5 O6 D+ D! V# y( v0 y; z
#include <stdio.h>
5 [: ~6 n" v* n& \9 l
#include <unistd.h>
4 T# y8 i% I" P8 x, e; {2 @' p
#include <sys/mman.h>
4 n; w- ^: v+ z6 l8 C2 m
#include <sys/types.h>
9 E' N3 Q5 P3 [4 w% c5 |
#include <fcntl.h>
- y' \, A2 s+ C* ~- M
. V! i# a0 f9 p& U' `. a
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 U/ W$ `1 c: \1 X/ b: J2 l: U
#define SHAER_RAM_SIZE (0x20000)
9 Q, C, n [0 {$ O2 N l: U C( @% R
& x+ l) ?5 E( ~- y
typedef struct
0 k2 v1 X# A( {
{
9 z$ V2 m) L; a0 h ~: q
unsigned int a;
- i( ? M( S4 t# K7 _
unsigned int b;
7 ~7 N& \( g* G# q" b2 R; e' [
unsigned int packet_cout;
, |6 f7 j( j1 c, \" ]( i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! k, M' S6 ]+ B6 ]) ~1 d
: C& u) X9 B9 z5 V& k0 Z6 O. _
void read_MSG_buffer(int *baseaddr);
5 r! K+ ]& x0 G8 m
unsigned int count_copy = 0;
* A. M. W) ]& J% X' F4 h# b
! e6 F+ c9 M& O T
int main()
& _$ o: R$ y/ y$ H
{
9 I0 i9 e) r/ o5 V6 W
int fd;
$ _. E# h6 H' Q' I% K* @5 N# J
int *mem = NULL;
m; \6 P% N5 X1 u1 W G7 N
- G5 `& t; {$ G/ g7 j% |; D2 `
if((fd = open("/dev/mem", O_RDWR)) <0)
/ S/ P1 F; U0 ]4 r
{
! ]1 c3 K6 h& r+ W6 W/ a! \5 a
perror("open error");
8 x) Z6 _2 U* C$ ^' j, ~; c& f
return -1;
2 B/ P) O( z2 Z$ \0 n. g( l8 r) g: A
}
, @2 g" S' v1 M9 T* F1 F: r; x
% i4 u2 `( v) O- f7 ^+ C" E
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 M6 e2 q0 s/ _* @* o+ P6 b C$ _7 s
: H: Y1 \) o6 Z1 B' l2 f
while(1)
4 E( u, I/ d4 N
{
7 ^3 \9 }8 V4 C f: J
read_MSG_buffer(mem);
" w" m" z+ W$ h2 f0 u1 K
}
2 H" v; c/ T; w8 W4 Z5 S
}
Q! H* d' @+ f& N/ L+ O
$ l! n [5 X+ |/ g+ f3 m
void read_MSG_buffer(int *baseaddr)
( Y3 @0 L4 b! P9 n3 M
{
9 i* E; i* Y( ?6 I: D/ m, j$ A$ \7 ]
pRX_MSG_PROTOCOL pshreRAM = NULL;
; U' Z& L6 O( n5 V
8 i4 U( N8 z1 C
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- @. |) b# G, u
5 o* \4 G5 N4 `3 M2 m A2 |
if(pshreRAM->packet_cout != count_copy)
' `' E$ s2 Q# O- T# | j, x% D
{
6 }5 F& x6 r/ n6 v+ E6 k
printf("a is %d\n", pshreRAM->a);
# }9 ^/ b3 }0 h4 O, ^
printf("b is %d\n", pshreRAM->b);
1 |" x- e5 F( H. q$ t! P9 }& A
printf("count is %d\n", pshreRAM->packet_cout);
. ~0 c# n% V1 o1 |; R- N
count_copy = pshreRAM->packet_cout;
, N+ v- ^3 R' t( p4 k& a
}
% O$ `" B5 i5 c2 v$ N6 {7 H1 I
else
9 N9 ^# ?2 z, G, J
{
v0 u7 A; q3 o
printf("No effective message!\n");
& J+ {) ~0 ^* F. n! Z4 H2 {% O
}
9 G7 Z, p$ p8 F" e8 `8 d- _8 [1 \
}
& X: D1 ?# e: |, V; {
" }$ b! `4 r3 U& }0 r
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* K% @' u7 y& r0 A
, X: I9 c2 ]8 j* a5 x) e/ v
" B. B( L6 o G! X0 r
4 C0 g5 |& \+ x0 @! E
- I$ j% x: \3 c, i8 R
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4