嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. v& Q( g0 [$ v& v( L$ b
/ x" l5 A2 |+ N/ f6 L2 m
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, K" @, g& i& ~% y: [5 A, |
#include <unistd.h>
, G1 w/ F& h' X: q. A4 @; [3 G
#include <sys/mman.h>
1 S+ G6 w2 f6 ~/ S1 n% |
#include <sys/types.h>
8 N0 X" K3 U" e: N8 Y# G7 Y/ T
#include <fcntl.h>
0 D5 p$ h) J, M% h1 }& s9 V
& P7 |% V0 b3 Z4 ]8 c. h
#define SHAER_RAM_BASE_ADDR (0x80000000)
- p( o6 E; i3 }& \0 d
' V. @' \7 H4 a
typedef struct
/ ]2 B" \5 k8 g% y
{
" b4 t6 L6 T Y
unsigned int a;
! c4 |) y8 O# x7 i2 Q4 z
unsigned int b;
+ F' u) G/ @) H K
unsigned int packet_cout;
6 W2 h- O& V! ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! V/ |: r1 |0 O5 [+ L: B: f
+ A/ I! e' y8 {6 V! q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# L4 p- ^: |$ [% |7 D& ~1 }0 [. W
unsigned int count_copy = 0;
2 \8 u, b! x. h
% V& G$ i* A8 S! t5 M0 I9 T
3 j; S& n: H6 q- w/ v# U7 |8 Z
int main()
0 {, \! w0 s* ?6 @' Z; @ M! e
{
$ _; a* t' I. @2 B
pRX_MSG_PROTOCOL pshreRAM = NULL;
, p( m9 |7 ?, F; p: u; m
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ [2 \% G+ N! g F7 G' g
( L* y G0 O8 t3 S
while(1)
/ W# S( F* w/ @. g( z
{
- g, \; \. l, [; c# V) n
read_MSG_buffer(pshreRAM);
& ^: d( G* o b! n1 ]+ E8 ^
}
; i; H( l) ?1 ~$ J
}
( k+ Y5 E2 A6 @" p: V
8 O4 X! }: W% S1 {0 T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 e! i5 J% P1 j
{
& `0 U3 Q! @. a7 L8 |
RX_MSG_PROTOCOL buf;
4 @" { M; ]( N( F
, M- X; W) ?$ g# N) M" l, I) C
buf.a = pshreRAM->a;
1 K9 c* L+ } H6 A0 w& ?4 C- u# K( ~
buf.b = pshreRAM->b;
; j$ X2 }1 x N" a" O! s
buf.packet_cout = pshreRAM->packet_cout;
7 z8 g7 F: \" O: u$ C( I
0 f* A2 e& @. A
if(buf.packet_cout != count_copy)
2 h% @" K8 h; K2 W/ u
{
" J/ l+ O4 D; b% _
printf("a is %d\n", buf.a);
$ } x" b! R# d5 k1 T
printf("b is %d\n", buf.b);
7 z4 _, @ o( C! W$ Y
printf("count is %d\n", buf.packet_cout);
3 W' G. e7 L s' m1 u/ G
count_copy = buf.packet_cout;
& ^# n: T7 u3 s9 \5 N
}
% R1 H$ A/ {; j1 {9 E2 s4 i7 x
else
; l6 W4 N$ p, ]3 o( `2 a
{
2 h) V. B' t. ^1 p3 S0 n
printf("No effective message!");
7 o' I/ r: N0 \; P. I. |' C
}
( c. t) O& u" F. s& K
}
, G; d/ b) Y$ x; G* ^& u$ y
- E7 m/ l3 U- e" q, ?& {
/ ^# d' o# x" }8 S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ O8 e2 ~9 r$ |3 H S
使用下面代码,对内存使用了mmap函数后:
; W# `) y% N' r: [! ?' G
#include <stdio.h>
; R) Q, c2 x1 x* B/ `
#include <unistd.h>
C+ D# V7 W* J9 [ T
#include <sys/mman.h>
2 _+ o% b6 Z& Q# m" O
#include <sys/types.h>
3 \# Y& L }( R- Y; S8 k
#include <fcntl.h>
$ B8 D/ p$ j" S7 W+ T% o% x- s
6 ? E7 ^( O* O' L+ u1 N" E
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 Y1 S) w T; q
#define SHAER_RAM_SIZE (0x20000)
1 h) o+ U1 ^$ {8 i
; m( V; q3 c3 S5 ~9 |
typedef struct
5 \* I7 i6 M& d% Z6 c h# p
{
' r5 R- e! L |: y/ A
unsigned int a;
: `- \ j; F1 c6 B# {4 ?% C; `
unsigned int b;
4 K& r& ]" a1 v& @1 l
unsigned int packet_cout;
9 w* W* R& [( Z) F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, K2 c" o7 W3 t' L: {8 y6 y, E
: X l9 h) T7 x/ q4 u2 X2 w8 G
void read_MSG_buffer(int *baseaddr);
+ k( d7 y* G2 k0 ~1 r2 ]
unsigned int count_copy = 0;
2 U l+ `7 \: Z. N5 N/ Y
3 b6 ~4 U2 H& t
int main()
8 L O4 S* A Z, o6 p/ {& U8 m( u, Z! T
{
+ C m- p- f$ H2 D6 D6 L, ^
int fd;
- l. L$ n: E; K$ E& T
int *mem = NULL;
: T4 {9 Q* M8 {6 m6 P; K& P
% \: W8 c2 @7 f- K4 K( i s8 p
if((fd = open("/dev/mem", O_RDWR)) <0)
- w" ?8 E" m& N% }" n) O% R6 \
{
$ N" S* G3 Y/ u2 ^- x
perror("open error");
: y: s/ U- l' T3 C( W, l! r4 k
return -1;
3 o6 ^$ I- h: v, H& t/ v, U
}
5 I8 ^, B/ y7 @5 j8 P# b6 h* x
: _* d% h( x$ T4 u
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 h# t' T- m0 {# k8 B/ d
4 o6 s/ }: Z$ J& t: @/ C* a
while(1)
4 {# o- w" a; J/ h# o" r5 u6 x
{
, w h3 H7 k& V4 H
read_MSG_buffer(mem);
. I. c: x q$ L" N* v& D! @! w
}
5 k3 P( j+ j! e& y$ b* C4 W5 v
}
/ c8 V0 A* n7 y: b( w$ v% e$ d$ k
( H; P' w2 p+ Q& k7 w' P
void read_MSG_buffer(int *baseaddr)
4 M- ?3 F3 n! o! b
{
* F6 U! P2 r* J* G5 w
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 ?0 g u+ s0 B7 {, i# @
5 g& H: M2 ]# w2 {' @
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 `6 w) O. ?! t. O! D6 n5 u
" j4 b, k7 J6 D5 {
if(pshreRAM->packet_cout != count_copy)
6 l* I6 ^3 r# P5 ]+ A9 f+ {
{
/ V2 Q( m( f. D3 W7 O/ D" e& {* e
printf("a is %d\n", pshreRAM->a);
+ Q F3 X0 }$ _
printf("b is %d\n", pshreRAM->b);
, L# z; h/ w5 p+ f
printf("count is %d\n", pshreRAM->packet_cout);
5 {) T0 T& ~) V. E
count_copy = pshreRAM->packet_cout;
" ?% f9 H- A0 p
}
4 v0 `: [5 q/ ^# `
else
' ]5 @/ t s E( h* @: Z5 S$ s
{
K( t# N2 N$ L! ^9 |! i
printf("No effective message!\n");
# r& f( e* ~: P! H$ ^9 B
}
4 V; k0 H- S0 u; Y% v) k0 p3 K9 T! u
}
. x5 v/ l2 C; z$ g: K; K2 f3 K) ]
+ _( Y7 X+ D1 }+ I6 @1 W; g
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ x( b0 N; g0 L. H+ F
3 _8 U& k/ {5 U) U1 N
: ^- ~. B- q5 I) |1 \: W0 R6 }! j
) O" H& l+ p0 h6 `& g7 p% `1 b
( N- I: f* S2 M
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4