嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 I% r) r3 i6 G8 w9 q& j, I: P. e2 f
- w% A! {$ T# F- m( {8 s8 o+ {1 W
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& p, i; V# l& k3 x. Y
#include <unistd.h>
' Q8 J. N& h- A# b" h, t
#include <sys/mman.h>
N1 Y0 ]' k5 }; o" n. c0 w
#include <sys/types.h>
* K* z% R+ J+ T" S9 \
#include <fcntl.h>
$ h) |+ Y" u* d) c H8 J9 |4 @
% Z- ]' K9 B6 h ~9 u; }5 E% X1 M
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 ?8 g3 G7 W# [: F/ E6 p6 a
* O. X h6 v- a. o3 R* v! l/ O
typedef struct
+ p2 ^( }- h) @
{
3 t) w1 u1 H7 H. q5 H
unsigned int a;
. w" Q# z. h$ Z9 t$ z
unsigned int b;
3 _$ L- @5 D+ G/ |
unsigned int packet_cout;
$ s- T. k. e5 g2 E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: b5 ?/ |7 C9 M/ ^' h
* `1 L( G" o( G0 A2 P6 q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% q) L$ J, q* |: R; W* Y+ B# r
unsigned int count_copy = 0;
7 H6 L! D, F3 K
6 e& D7 `. Y) f% N, [
0 f& V- w; k& }/ s: L2 P
int main()
. A9 G- `* n7 ?( T; S: L& S
{
" z5 b+ u' Q+ f+ p: L+ E7 a
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ {9 z) t+ w) i7 ~6 \9 n. ^
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 @1 w( t/ o' W3 w& i' E6 d* w
9 o) y, a, B( R/ o
while(1)
5 h0 }' h2 J! Q% a* O' |+ ]
{
" n6 A) R9 Q7 Y" I6 x
read_MSG_buffer(pshreRAM);
+ p2 r( b9 c. U$ q9 `$ H5 m
}
- w, i/ Q% q/ L" U' @5 P7 z0 v! w, ~
}
1 |6 Z0 f+ q6 z" A1 w3 g9 C
! o/ v+ U9 n2 M/ r- ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 B. ~0 }* Y" H" r
{
0 f( K4 Y, n+ Z) j6 N# e
RX_MSG_PROTOCOL buf;
* j: B, P2 a/ T$ K* b! n% `
]; g0 M5 H! i, r; C) R6 k
buf.a = pshreRAM->a;
- g' x+ ~3 M% s( a; l( G
buf.b = pshreRAM->b;
0 F. v( h( y# C ]7 \3 D
buf.packet_cout = pshreRAM->packet_cout;
0 q( i# m5 p9 T5 H. o! k
( q7 O2 _ V1 d! t8 I
if(buf.packet_cout != count_copy)
0 K% [1 J, j; \$ C6 }6 c
{
( ?* C+ l8 n; U9 i" w& ?
printf("a is %d\n", buf.a);
+ `$ x2 H" P. C7 M
printf("b is %d\n", buf.b);
/ L' ~" A% y6 p( [
printf("count is %d\n", buf.packet_cout);
+ X5 ]& \ y( l
count_copy = buf.packet_cout;
/ w0 |1 A8 \& F
}
5 K0 ?$ n) E$ b3 |) E
else
6 A" F+ r+ H: u& W+ p( _ p# d
{
6 t6 z8 `* \4 ]! J4 f
printf("No effective message!");
- Y4 h/ o V C+ L/ _
}
& \" s y- @8 o8 }4 W( P9 e
}
7 K6 g8 \& ]. q4 y8 l; `
8 ]2 f+ n5 [& W Y$ K2 D- \5 v
* J# a* w4 T. w d( f4 U: i5 x
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 {& C5 P5 B- A5 d. Z) N
使用下面代码,对内存使用了mmap函数后:
( Y' o5 {' n7 `7 D2 A$ v+ G% B
#include <stdio.h>
( K& ^& O! x2 d3 B( x# X
#include <unistd.h>
$ F7 W) m- ~4 k6 K1 O
#include <sys/mman.h>
3 B) L/ H7 j# ?% D
#include <sys/types.h>
$ n: S9 b! u; P1 C5 X# |
#include <fcntl.h>
4 z2 N8 ?4 m& F) x- M( e! C# d
5 h0 y: b( ~, J& _. O7 w+ v
#define SHAER_RAM_BASE_ADDR (0x80000000)
- Z+ |. `' a6 J" s% P1 t
#define SHAER_RAM_SIZE (0x20000)
* H2 L, u L% f1 W. Q7 s \
5 }) x" N4 }# x
typedef struct
/ U" W( [3 w8 y* ]1 F- A
{
2 T3 r' m1 ?5 L3 x( D5 O
unsigned int a;
9 C$ x+ G4 w/ P7 n
unsigned int b;
% B' D8 E) F% G# }8 Y
unsigned int packet_cout;
+ s5 H* E- H7 Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: N- h1 D$ a' U/ Q5 Z+ ]6 [* }
) t/ t! m7 F% V# X3 k! l
void read_MSG_buffer(int *baseaddr);
4 w- _4 B# e9 o/ Y0 [& v" g( _3 y
unsigned int count_copy = 0;
1 Z; d$ C0 r* h3 P
! y3 H% k; S8 C' Z2 P) m
int main()
9 v _/ i) C. t. e
{
+ C4 \' ]0 ?: _5 H- h; L: d ] ~4 L6 m
int fd;
3 }" r$ R Q- |5 D7 n8 g4 U
int *mem = NULL;
* F6 d8 L4 M8 P$ G8 ], n" ^
% b8 M; z1 n' f' K" i% l' {
if((fd = open("/dev/mem", O_RDWR)) <0)
. |" ~$ h3 ^5 n8 k. d
{
& v$ R! p' l. P5 g. n
perror("open error");
4 S/ X: P& t2 J# S
return -1;
- Y1 t7 p5 r2 M; K
}
/ G5 t% D: u+ @/ }3 u
% [' v" D& E( }' l7 T
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 a1 d$ ?+ E) H) N
, T1 P) U0 q" w# ?/ j
while(1)
; E2 ~: a$ J8 a0 s2 l
{
, f+ }* u8 p1 F( Z
read_MSG_buffer(mem);
) O" f6 Y, Z7 x2 a
}
. ?2 l- J ?9 C
}
% n3 A7 F1 b; t$ H5 B
* s' N% B# N$ s. [. v
void read_MSG_buffer(int *baseaddr)
$ I! P( b0 m' p2 c4 e0 _' e
{
8 ~ X1 y6 }$ e ~1 |3 u: a
pRX_MSG_PROTOCOL pshreRAM = NULL;
- e: h+ q( k5 ?* u) Q
/ K% Q2 k0 B6 Y2 L8 o
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ k5 {( P9 O5 i4 N/ U
' g* r( k: O, h/ d
if(pshreRAM->packet_cout != count_copy)
5 V" ~6 K2 [7 e6 q
{
: K" Y5 @2 ~2 X2 E# m' L
printf("a is %d\n", pshreRAM->a);
! m# k5 S1 ~/ ]3 s$ C% ?* K
printf("b is %d\n", pshreRAM->b);
1 W+ c: D7 [9 W3 a
printf("count is %d\n", pshreRAM->packet_cout);
: o8 I) V' \$ W7 n5 d0 Z
count_copy = pshreRAM->packet_cout;
* X6 _% f& T: ]% p7 o9 Y
}
( \3 Z3 c' c% d' S; j$ T
else
: ~7 y1 G) t$ N+ X! B- `
{
2 V& ]3 o1 N0 T% o# D0 p
printf("No effective message!\n");
5 q7 O* @+ L% J3 `! e- x, @: p! U
}
2 Z( ]* Z0 v1 P
}
7 K: ~+ t) M2 l ]& x. h$ J
% r9 t. m8 e: s% e1 D& R5 s
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 O0 j z# S) o
" k E+ [' U$ S0 e2 y. K# [
+ H2 D$ z1 _8 y7 n5 D
2 |- z& @9 O# T2 r: T0 q' n
) e+ `2 v' [+ V
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4