嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 s7 n1 E; R! H: ]" @9 d+ {
; q7 g8 O2 F8 p* c8 V9 S
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 N; }1 f# o$ a
#include <unistd.h>
5 z' G! ^) l% ]! X) p1 X- @! Q/ ^
#include <sys/mman.h>
" N' z) I6 c+ I4 B% Y7 I
#include <sys/types.h>
" i! d4 ]/ V" I. J% _5 o* b
#include <fcntl.h>
& f# B; _* l% f! c7 p# i
9 B/ l' k R' K& J% C
#define SHAER_RAM_BASE_ADDR (0x80000000)
) @0 s' R- _- o, K4 |- d
2 D! x7 q5 }7 n! i1 z# d/ ~. o
typedef struct
2 B0 I( q" v" @
{
/ l7 Z! R7 y9 k) v
unsigned int a;
3 s: a* `5 m1 r- m2 [
unsigned int b;
3 R2 [, X I& L& Q
unsigned int packet_cout;
: F. u1 E, j, t/ g2 T! S+ u3 ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! L3 D% I4 F/ i& x
+ H% m9 K2 a7 G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, A" ~) [. D0 Z* C
unsigned int count_copy = 0;
7 Q1 E# T$ r$ r7 B8 y( ^3 y. W
7 V/ Q5 @. @9 y; G
( Y/ t e. n) w' H* Y5 k
int main()
8 G8 U- D4 J* d0 o
{
1 `& o! q' A) n* G
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 Q! W9 U! W+ L1 N$ ^2 {4 p ?; Q9 H
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 t* ?. Z$ V% T% S% I* _& Y
7 S& h0 Y& V+ Z% O% R
while(1)
' \$ [& J. G; \" Y+ R
{
( b7 {* C+ i: _5 l7 R' ~2 U6 e
read_MSG_buffer(pshreRAM);
: [ q" s) \+ S2 i2 }- S& U
}
9 I& _; q( Y1 g! d
}
( n& J$ {) [& `. f
. W/ |" [4 Q% h/ j q$ {0 q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- i' K: F9 M8 n- W$ P
{
1 i, u! b5 f- T+ g" j% w
RX_MSG_PROTOCOL buf;
/ q/ K9 n5 ]5 b+ b# }% l
9 x. ?. T3 k" V" b2 a! k) F
buf.a = pshreRAM->a;
' y- [, l: ?5 x; b% N
buf.b = pshreRAM->b;
6 j4 m1 U* T" l) w( l
buf.packet_cout = pshreRAM->packet_cout;
0 U- ^0 N9 K L1 R3 ?3 k4 d6 W& S
& ]$ d1 A8 F( z! N [& l2 [* r
if(buf.packet_cout != count_copy)
* G! H% z' w' `: N, l
{
$ d' z" ]* i& e/ d% Q( N9 b# U" {
printf("a is %d\n", buf.a);
" V. Y% M* N: S. i$ f' |
printf("b is %d\n", buf.b);
" E; C, e( N6 \" P, Z! d
printf("count is %d\n", buf.packet_cout);
0 p* W* x# y4 n3 ]' M* x( G
count_copy = buf.packet_cout;
$ w. y0 v* N6 R
}
. s5 C1 }1 Q5 z$ `0 l
else
, Y" {# c3 b- ^( S
{
5 \& x; M6 w D4 h! @4 S
printf("No effective message!");
1 i7 o( g6 j3 J% Y6 ]
}
5 V3 j3 `/ U5 I/ F D4 \5 ^3 }
}
" h0 w8 |% K2 a5 f
- X6 W: k R. O7 n: L+ `5 ^
1 f: I$ U& Q+ K# z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 \2 ]. L* i% N! m0 I: e" |7 v
使用下面代码,对内存使用了mmap函数后:
& U8 `3 }$ p- E1 l7 U
#include <stdio.h>
# K. q" {- h1 p* i8 e* W1 }. r
#include <unistd.h>
! T( b8 T- B$ C8 o9 U, t
#include <sys/mman.h>
9 M% y# \( ^! t$ N4 i
#include <sys/types.h>
; ^: S/ Q! F% H
#include <fcntl.h>
6 ~4 p- U; `7 K3 e" w3 y, o1 ?! J
" K" A) a- u9 ~8 z+ f
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 z' k9 h K& A# Z
#define SHAER_RAM_SIZE (0x20000)
% b( `. Q5 a( P; _; M: k- j
0 ]" L3 |4 w5 T8 _
typedef struct
4 Y, a, L! J* v7 ^& m& p
{
3 p+ j( T4 K6 k/ ?1 L9 b
unsigned int a;
8 u) Y4 r% X" P- V. _ l8 A
unsigned int b;
3 H. \7 m% N, k" E: a% E. u
unsigned int packet_cout;
# B7 j" z0 A8 H- @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, `" D& L7 m2 v, u
! G, i, H# ^7 ?4 S; J+ x5 O
void read_MSG_buffer(int *baseaddr);
# |! A6 @) A) z& i9 B3 H5 R7 @
unsigned int count_copy = 0;
# V3 R) Z) u9 f( q4 c# _
+ Q+ \$ P% X3 c$ E. i3 E8 J
int main()
$ O$ k8 r* N0 {
{
$ P$ F1 {$ R/ u& X" X: B: O
int fd;
7 ~" N5 u' _7 M9 w
int *mem = NULL;
$ l4 n0 R9 N7 w: r z
: [/ ^" u# {: V5 L8 f4 E0 O
if((fd = open("/dev/mem", O_RDWR)) <0)
2 U$ ^8 S* n0 u5 z1 O5 O2 S
{
# y5 M, G- g1 |1 a
perror("open error");
0 I% ^% P& t' d. B8 ]! H7 s
return -1;
' G4 S) g4 j: e, v. M3 \2 |
}
" k& E! r" O6 L( D" a, k
, Q) X/ t6 m2 S/ C7 H! m A+ k
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ G% B2 N6 w# B# `# [6 ~" K
E% k" T) ^, i7 q2 _# h
while(1)
% B: H6 M. D1 w; N6 W7 @$ E
{
. }- j) M3 m$ z. V3 Q) f
read_MSG_buffer(mem);
" v$ V6 X2 j& A ?) o0 |% V
}
7 x0 E5 D* L* E! C* I! {9 D
}
( m z, \$ {, L5 D& L3 L
. v" N, W. N+ c
void read_MSG_buffer(int *baseaddr)
( r8 u# i8 Z" L. N5 |( Y1 s* n
{
- G0 P0 O: k9 B1 E
pRX_MSG_PROTOCOL pshreRAM = NULL;
p" D, u8 y+ R( h+ {) I+ t
1 M( E' Z( X' M# c* T
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- j9 J+ I) v$ l0 V" v. H
! m2 M( I+ A% g: X9 d) X, e5 ^! x" J
if(pshreRAM->packet_cout != count_copy)
: A* w" P; Q z! r4 B) D
{
9 [3 I8 o' f( ^1 j- |. K1 d
printf("a is %d\n", pshreRAM->a);
1 T, ], a; a: M7 w) O: E
printf("b is %d\n", pshreRAM->b);
7 m; B6 m/ I3 F9 {# B
printf("count is %d\n", pshreRAM->packet_cout);
: }' m# k/ L3 u
count_copy = pshreRAM->packet_cout;
. m! k6 e9 T. }
}
+ Q9 `1 W$ a; n4 \# S
else
- |0 p8 |% Q4 _) I. k9 j
{
; A, X; A1 X; e9 C9 R3 e
printf("No effective message!\n");
' b! m0 |5 P- i5 ]) U5 P: }6 P
}
1 e( N: {1 M$ h" T2 I+ T
}
9 e- x7 G y/ R5 k6 Z& ^
6 a9 ~4 \" ], c5 d, e! R9 G
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 P; L5 n8 v ` ?" n& H5 J! Y: f
1 f/ Z" o% J& f t+ N$ L: O
: P0 S- e0 \0 n2 a/ G
# i) I% M1 D! Q! S5 S
0 l# \/ {0 \& `& y# e: s
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4