嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) I |9 J5 ]% v/ g
: K7 a2 u. O. e) O
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& k% I u4 A ] W
#include <unistd.h>
$ T7 N5 _6 S! w( B8 m' T
#include <sys/mman.h>
5 T3 X7 E/ Q* D6 Y( d0 d2 f
#include <sys/types.h>
% j7 Y, o1 g0 B
#include <fcntl.h>
+ S, N( V A$ {. m0 g% s2 ] b
& O. `6 T8 [+ i, A
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 v. l4 v7 f3 Q* `/ [$ ~- Q
0 x. K. S5 _' P' @3 Y$ L6 ?
typedef struct
/ |4 t3 i6 Q, p0 E, C3 W/ Z1 X$ Y
{
6 {7 [ O3 y/ z. q+ Z
unsigned int a;
# }. K) b% l. P) U7 u
unsigned int b;
6 l" s% o6 B$ D+ ?) G$ s
unsigned int packet_cout;
* q4 o& {( T# v1 h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ N% L- ]" O& j' A$ K2 _
( E" ]9 u- N' I- H. w/ [+ i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. K1 N+ }0 b3 E( A- w1 ]/ T
unsigned int count_copy = 0;
+ g# J$ J3 ]" m- v9 }6 r, y
3 F& Q3 a8 v3 B, }
0 \! j1 U5 w) t: @% g9 r
int main()
- R) E9 I1 K. G# P. L
{
6 ~- h$ L0 u4 H+ L: }) i3 k
pRX_MSG_PROTOCOL pshreRAM = NULL;
: S. z4 P- d- n
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ R+ Y2 {" H7 a6 U+ B
! W9 Q, R* y* s j
while(1)
& b- @; q4 b" q g# Y: E: a
{
& n8 j$ x: i" ]' }! t
read_MSG_buffer(pshreRAM);
/ l' m* x$ ?9 a
}
; a0 h! ~8 V t# v' O$ M
}
8 y/ i5 V4 \! I
6 ^' x7 C! |6 C+ f1 g9 {4 y1 U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: p" W# W; K' G' Y, Q ]4 k
{
. |; l$ k9 h: I, C
RX_MSG_PROTOCOL buf;
5 z7 S: n7 |& `* r
% @# }% g V/ F/ {8 d7 C
buf.a = pshreRAM->a;
6 N% q6 |) X* B/ I
buf.b = pshreRAM->b;
: Z* |/ v$ f% R# ^" M' B! a4 k9 S
buf.packet_cout = pshreRAM->packet_cout;
4 X* s6 i- v, ]) M2 b+ i% {7 v
* |* Q. ^; T7 j2 X% E% r# m- }! u) n3 U
if(buf.packet_cout != count_copy)
6 `& u7 W6 \) Y
{
: u& ^: b) j3 N* L2 {
printf("a is %d\n", buf.a);
0 h7 w8 I# O V7 r
printf("b is %d\n", buf.b);
3 R1 e* ^; d1 J
printf("count is %d\n", buf.packet_cout);
% L# Q! G: X: G( {
count_copy = buf.packet_cout;
( X, ?, ~, } c6 I/ k
}
" x1 d; A9 i6 P" k7 X t
else
+ z& ]! ~8 w0 n0 J% S2 T, v" p
{
; c: Y/ B# y, H) g* b
printf("No effective message!");
& g0 }; R/ J$ K+ s V$ ~
}
# w F$ D% h6 f6 a
}
1 {4 x6 g* S' ]+ y. `- u
: t# B, O& r8 w
& ^1 S C; K3 d/ U* }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. B1 g o2 A8 J4 q) O
使用下面代码,对内存使用了mmap函数后:
$ t: A) Q4 Y ~6 K" _. H6 ~
#include <stdio.h>
" q3 ^# G3 `/ O# c
#include <unistd.h>
& }6 \, z8 A6 d: K" S. H! ]
#include <sys/mman.h>
3 J% a: t; \, ^$ l; X7 b
#include <sys/types.h>
$ h' h" ?: _; r
#include <fcntl.h>
& _3 F' m$ w3 F1 K _5 I
9 T" K. [. ?; ^5 [$ F& ]" k
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 _" W3 c* h3 b6 \- L! I! Y
#define SHAER_RAM_SIZE (0x20000)
" o, d# y1 s4 Z0 N t3 K! [
* T/ ~( O+ @+ p! c
typedef struct
7 y$ p# U" Q0 i
{
A- @' W* ^5 ]* V2 a! z7 }
unsigned int a;
9 j* P: v, w: ]2 }0 M
unsigned int b;
0 \* C- B4 [( p, u8 G5 V6 r) M! c
unsigned int packet_cout;
9 g s+ [0 V4 K; m1 w; c6 d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& w# `$ a+ R; k5 F; ]; L
/ M( e" h- L$ \/ T+ n6 }4 [
void read_MSG_buffer(int *baseaddr);
/ C1 q; P) `0 a- x& p
unsigned int count_copy = 0;
. i8 Y7 a; j0 H- B' Y% M
9 A; F& M/ G, m% _# a! F F X
int main()
/ l( v, d: r/ ~7 o7 B) [8 x! K
{
- `; V) b' N7 R* r' w# }3 r
int fd;
, y2 r% E* j* {+ f4 D
int *mem = NULL;
0 V( i8 I* r3 _1 T$ Q: @
* r3 w1 y7 I4 _) f. r. V1 @
if((fd = open("/dev/mem", O_RDWR)) <0)
8 t2 d4 y# \8 ^; u
{
1 A% H- `( T9 m" H: {0 F8 J0 C
perror("open error");
2 k4 g2 h/ x. |& i
return -1;
* {1 T/ X$ r* {
}
. S4 ?$ [% y5 x
8 y8 f' E' K+ D- w' d3 p( s2 N
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( J$ _- |: {# U3 J7 p3 `1 e
6 h2 U( V# ]9 w! C# \
while(1)
: N6 u5 p% {* U7 O8 L1 t' b4 f
{
+ c8 ?2 n. z7 |" f5 ~( K2 r
read_MSG_buffer(mem);
/ o$ q# A8 ^. b8 M3 \
}
S% |# c6 @# Z( z) [* _
}
R- t4 D8 |; L) J+ V/ M
6 h t4 Y9 o" i3 n
void read_MSG_buffer(int *baseaddr)
- W- Z C9 z, F9 b2 h) E: r- Y
{
! ^- I$ V/ [' H, D' n* Z
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ p# w4 \9 i* ?: t' t6 A4 C
- {2 p3 E' u' A5 v7 ]% |( g, |# W
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' T" F6 F8 K1 w0 C" z& [7 x7 i0 c( l
9 t, g( W4 M8 R& ?1 C& m7 C
if(pshreRAM->packet_cout != count_copy)
+ x! D3 W( v* x1 j
{
* F5 z2 H2 Y7 h
printf("a is %d\n", pshreRAM->a);
$ G" F& U7 ^6 n) j7 ~5 @
printf("b is %d\n", pshreRAM->b);
! S/ _8 t: N- t* l5 F4 ?
printf("count is %d\n", pshreRAM->packet_cout);
/ |! i& x8 r3 C% o
count_copy = pshreRAM->packet_cout;
; W" C: Q6 F7 \9 [0 `7 S, l# ]
}
/ o0 Q- B, b- y5 l
else
' b( G, L7 s) Y6 ~; c, U, V
{
$ y m% R1 x6 l& Z
printf("No effective message!\n");
5 M+ a& S* ]' ?* I: c+ P$ Y: U
}
5 s9 Y' ?/ K3 ^% z3 d3 p2 n
}
/ k7 |# a6 l7 k/ P7 D# R, h
. @2 R! I& a) `9 O* Z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' }/ y Q, e' c. t) C( C' _2 J
& ]2 P1 D/ y7 q
$ O$ R9 E; j8 ]4 T" m7 R
3 K; D2 D% r+ X9 g
( ~% W' C$ j/ M& ?) L
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4