嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
C+ t# ^" o6 X& D
X' P4 A3 O+ J( v+ `; D7 \
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! v9 ?4 M$ ]0 L; N) j% ?4 }6 s" l
#include <unistd.h>
/ x; ? V% T4 y1 ]' @
#include <sys/mman.h>
; p# P+ f$ A' q& D8 F
#include <sys/types.h>
* }4 r5 a7 p# o7 I
#include <fcntl.h>
- H8 `/ |1 r7 G6 ?- s
! [1 s3 v5 G( p& D
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 `$ m0 u+ K. k# ^, c' ]
4 Z. Y# J: I: j( Z/ D/ L6 |2 Z/ I
typedef struct
4 T0 A& M5 ~8 a; u* v4 D% ]
{
2 C2 k' L. `9 s+ b& i
unsigned int a;
3 D3 Y, E' a! A0 b6 x0 R5 U; d
unsigned int b;
6 ]: c% C4 N6 w
unsigned int packet_cout;
( R# A- U2 u% j3 |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 W% @. R$ e u4 J. g, n
% S: M3 u+ a2 Z7 v- _. [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 i7 e9 u3 F7 n; ]5 n( N
unsigned int count_copy = 0;
0 I& U+ L; ^# A' E& |* b
2 k& J+ v) R3 b
% Q" F& x8 z6 s5 j; f! _+ O
int main()
5 p. v% V, W! {' c$ K% t- }
{
) o: O) i- }$ v& i
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 ~7 I Z; ?5 K
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 ?$ Q$ q ^. T3 ^6 R7 L
' q6 r5 g! }( P( }
while(1)
3 M9 V/ W: ], @ W4 h" K
{
4 _: o* {- u/ k c! n
read_MSG_buffer(pshreRAM);
/ r0 s8 Q$ ^! O" D1 v
}
& G4 `' B! {( N0 R/ x
}
( L n( A) U3 e# R: D" R+ W
4 r" x* B% h/ X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
W8 w% w) D9 B8 s8 m- J) {
{
6 K; H1 k/ b! r9 A1 k" R. o4 n
RX_MSG_PROTOCOL buf;
/ \5 M! G+ e1 |" s( Z# b
1 g" ]. [ P( S6 L1 X" f
buf.a = pshreRAM->a;
! i U) E6 ~; }
buf.b = pshreRAM->b;
_0 V5 Q* D S9 Q* `( \
buf.packet_cout = pshreRAM->packet_cout;
) B5 Z: _; ?! Z
& _6 ?; d4 _" D. ?
if(buf.packet_cout != count_copy)
3 k) D9 \6 Z4 K3 C+ U; [) }
{
- J9 `' `- |- n T$ P8 O( s0 a
printf("a is %d\n", buf.a);
' ?) A8 Q% j" Y
printf("b is %d\n", buf.b);
5 @. @) `4 y K
printf("count is %d\n", buf.packet_cout);
@+ L: J4 e7 ]: j
count_copy = buf.packet_cout;
s1 B" A% f# W: u. X6 C8 |) z
}
8 z8 j3 C# H! L! B( @- A
else
4 J; ^7 W4 j4 j
{
9 q, a" L; h( ^ C) [" h% B
printf("No effective message!");
6 `& Y6 `9 Q( k( ?. I O
}
: r" |" e& V" A, x6 `2 _
}
C3 I# T8 r4 t& I q
* M: ^2 A; f- G$ ^7 V, q* n
9 Q I O! S& i% Z* Q2 w" | x
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ L6 l q) K# A" s7 n
使用下面代码,对内存使用了mmap函数后:
$ r8 q4 ]3 T5 s' f3 X
#include <stdio.h>
& g, h0 j- P1 [3 B' K
#include <unistd.h>
) X Q0 {! Q, @# G" b
#include <sys/mman.h>
, P3 @5 u# b1 o0 T" |, {. l3 J
#include <sys/types.h>
4 @ E. x* {. v) s2 ?2 P. X' E
#include <fcntl.h>
) W8 h1 A9 [/ N
. i4 Z4 I2 h5 g4 ]& E
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 E+ y% M$ E, H: h0 |+ Y
#define SHAER_RAM_SIZE (0x20000)
+ I6 ?: |( u5 K- O0 T* G
" k8 I& u7 W4 [" o7 b+ |' i
typedef struct
! o7 ?# Y) H# N; ^; Z
{
1 c) q" A0 K* K9 l/ v% ^" a9 V
unsigned int a;
- N- F7 V9 \, c( D9 T% y5 M
unsigned int b;
. x( i3 z) y% ^7 Q2 K! G
unsigned int packet_cout;
4 m" L" z! O2 z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, ]2 k. U. Y7 D: F
% p6 ^' a4 b* z
void read_MSG_buffer(int *baseaddr);
$ s" _+ Y/ x1 Q/ R# L
unsigned int count_copy = 0;
! p/ k4 p: i; `) n9 e
7 g% J& ^6 o$ |$ c Z' @+ r* H# b
int main()
1 d- |0 ?) ~, @* s6 o4 S5 C
{
|7 d+ x( Y$ b+ I+ k2 P5 b
int fd;
# h" B5 j. y3 P5 a6 v# c3 ~& j
int *mem = NULL;
7 e, p; e' D9 Y8 U
, x( W8 | I1 k7 W* N& O8 O
if((fd = open("/dev/mem", O_RDWR)) <0)
+ }7 I2 X2 ]& n! o
{
: G9 p5 u8 [+ b: ?$ W, l8 L
perror("open error");
! U3 M# Z+ _- _% w$ R3 }6 L
return -1;
4 ^ K. M0 [; O, D! F
}
2 V0 t: |+ W1 U% W) K# h1 g: P& F& c: O
7 t8 g+ M1 t; d0 l* b
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 R' Q) K% Y" X( G5 b
: q/ ]% o& e% ^0 x! A- L
while(1)
5 J6 T; _. N- Y2 h2 |8 F
{
' C+ U3 i; A# K3 [
read_MSG_buffer(mem);
4 C; \ k: _1 y3 \4 T
}
# o7 j4 I# e# v1 z- p) U
}
5 D' [8 I. ]: O$ K; A
# K0 n* a$ K3 N! J( o, V
void read_MSG_buffer(int *baseaddr)
9 r i( r v( t- `* W0 z- r# \
{
2 L, r- J- G. R) n) j
pRX_MSG_PROTOCOL pshreRAM = NULL;
; V9 Z, r) D) |
5 O( ? \1 B8 j' r( F6 \4 l
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
Q5 y1 m8 D5 Z m* q& _
4 V& q, m& H9 k% a: m
if(pshreRAM->packet_cout != count_copy)
8 j! T5 o1 q% t. i- f% q3 H
{
6 t+ v4 ?; W# c- _0 ^. e* P
printf("a is %d\n", pshreRAM->a);
U( ?; w' c2 ?" @9 A5 V9 p
printf("b is %d\n", pshreRAM->b);
6 P5 F4 l" x+ I) m5 k. H6 Q3 y
printf("count is %d\n", pshreRAM->packet_cout);
$ g1 N+ h. }, z1 I; ?
count_copy = pshreRAM->packet_cout;
4 L+ Z3 _! U& z3 D6 j$ {0 u. n, h
}
7 x5 e% n2 l) B8 x8 h
else
( n, I" c+ i5 ~. ~
{
+ P9 G6 d8 C3 l# _0 G. h
printf("No effective message!\n");
/ n% P$ x+ S& U0 b5 g8 \& \6 a0 G$ V
}
- H" i8 [% M; v( l! A F3 ^$ w
}
: D$ M% Q7 C: z# M
}% e7 ^ q* c- y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( `# H' `, |! [4 j5 j$ m
0 P+ E5 p4 z5 l* q' G3 E; @
& P3 A ?7 p/ f8 ~/ q$ O9 u. H
0 ]8 r; B2 h; y! r1 n
( n3 }( [( M) X# }* x6 O" ^ A @
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4