嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ n* r; b$ E: U
K3 @4 u: c9 s
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: |2 ?1 T+ M3 b& H
#include <unistd.h>
+ z0 }: C3 j# M8 O! V
#include <sys/mman.h>
; z4 }9 r9 q; S* i# A' |
#include <sys/types.h>
2 r5 T. [6 h8 a, M0 }9 i
#include <fcntl.h>
; z8 P0 h l0 f3 M" H5 Q0 N- }
% ]' D9 O4 P, y* s0 F
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 e8 ^; a B0 K
) G# E! C* H) m+ b
typedef struct
: n& Z) p! @* p. q9 ?# z
{
- A$ c& s: y1 M; I2 u C, Q
unsigned int a;
5 T+ o D: s( r( I8 W1 h
unsigned int b;
& {6 k# k6 _) D' z9 ^" s g
unsigned int packet_cout;
! B! N8 Q. H4 X; F6 ]: ?& U+ a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ S9 d& U" O0 R0 J6 G8 N2 S
6 I# v- g N2 X* ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 K) z/ e$ \9 c& D; U3 b
unsigned int count_copy = 0;
( P+ y8 y7 G6 ]) C8 A5 ` }
# Q+ T2 h4 I/ [
4 t- W8 ^3 ?, z4 R
int main()
9 g+ u9 }& `4 g6 K0 V4 ` p
{
! A3 z' m. k/ c
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ Q% m5 N6 X2 i1 q0 j
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; C5 I# a, e5 e9 W
* y! Q4 c! V! {) N
while(1)
[# ~0 H3 q4 c: j- W$ y+ C
{
1 Y# H- b; p. y
read_MSG_buffer(pshreRAM);
/ j4 C: J9 k$ S, P m- ?1 A: x
}
) Y( N% [' I7 E
}
1 d& W4 P ^2 V: r/ P+ @
- Q7 i p3 B1 ~; N+ y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ j, m! I* Q4 u( w
{
9 |- e+ h2 _$ ]. j' Y
RX_MSG_PROTOCOL buf;
J5 X3 U# c! {# Z3 @
! _) ^4 K% P2 e5 d
buf.a = pshreRAM->a;
( p; N7 n4 P& h5 t: w6 B c/ h
buf.b = pshreRAM->b;
* p, L) o8 |; @* P
buf.packet_cout = pshreRAM->packet_cout;
3 X7 d6 F. F" e Z
- [* C* @3 M8 @8 t' ?7 }
if(buf.packet_cout != count_copy)
2 j: }9 n/ d% z) f6 L
{
. y. A, g# f" E$ w9 m* K
printf("a is %d\n", buf.a);
6 J6 e) D- I8 {. l+ |. v; G
printf("b is %d\n", buf.b);
% N' _+ A! Y* U5 ^. ~: x
printf("count is %d\n", buf.packet_cout);
9 R$ x. G. z$ h9 i1 a
count_copy = buf.packet_cout;
! W3 A1 Y6 F) @, y
}
5 W4 m) F7 r, m5 i+ z" ]
else
/ T$ y, n1 w! e! x4 {# N
{
" R$ Y" g' o. V* {+ P0 y
printf("No effective message!");
1 A* e; |' ^2 a8 F1 S
}
- W% {6 l( I0 c6 r! x. ]
}
& Z+ N6 E) c, A! u: [
7 S# Y' [7 X" c2 t6 x5 z) n, q
$ s" D" _1 X; q1 W$ f; L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% Q: n& P1 Z' O' d2 J
使用下面代码,对内存使用了mmap函数后:
- T }9 ~* K" a) `* x+ e- n
#include <stdio.h>
8 \( ]) Y. b: t- b8 l
#include <unistd.h>
6 A5 f8 o$ q2 i% J& Q- R, q
#include <sys/mman.h>
' p/ s- v& s# o6 l, p$ Q
#include <sys/types.h>
5 B$ J3 K3 ?4 C, K4 y
#include <fcntl.h>
: f- B& {$ v' _) {: S
8 C2 f8 p1 d2 y5 x
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ s( f2 p$ U% _% G: A- l& ?3 U
#define SHAER_RAM_SIZE (0x20000)
7 o( A% b( N5 J: I+ y0 c/ k
; b3 S. T( I+ X) W- {# ]' t
typedef struct
1 G3 X3 P# a; F _/ E P) G) F
{
9 a; A+ S! E, U2 U: M$ k
unsigned int a;
& _/ O0 ?! e# q
unsigned int b;
2 ?( b0 H, ~) b- t% O, y- z
unsigned int packet_cout;
: F' B- [+ d \9 \2 r0 h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& t- Q' P% d# `" i; H3 f) h
* K2 k1 f1 }' y( ?! v) z( p
void read_MSG_buffer(int *baseaddr);
: U" z j! b; C' R5 n0 U
unsigned int count_copy = 0;
, P; i3 C1 D5 W0 b. Q% x: t! O
% W& O2 ?. L- ?1 P& q. U7 d
int main()
' {0 Y x* J/ m0 s
{
; {# k/ \) P- m; l: b
int fd;
4 g- I5 m4 T% I
int *mem = NULL;
! g8 H, j4 r' T4 w* B
6 m' y5 f9 e' h/ u/ |- r: d
if((fd = open("/dev/mem", O_RDWR)) <0)
: _# _6 K1 L( d0 V
{
0 d2 R7 e2 e0 U" f I4 U. Y S
perror("open error");
0 ?7 E, A9 u- h$ s+ i; H( f) F0 R
return -1;
. r) V# A* L& C
}
. O6 q% U9 f( Z' k9 M
" u% t1 G/ X* f6 |7 n$ I
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. c6 E) i( g1 z7 u0 w& ^3 {
* u7 M! W7 D. H8 x6 Z/ v1 H
while(1)
$ i) j2 ]* x6 K) u1 Y" l% d* J
{
) S; l; L2 {, o+ [) L: E
read_MSG_buffer(mem);
) @9 r8 c( P" F4 {! g3 R
}
6 I' U# a' f* Z O
}
) ]& m7 ]- T9 \
( _, V8 I& G9 n: n- U
void read_MSG_buffer(int *baseaddr)
+ K+ S3 f$ ?2 u* m* q
{
; q1 r4 ]5 G& P8 Z; S
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 y0 p' n0 c9 \+ [5 X
# V3 {4 z* L9 L6 i6 X3 v9 {
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% W0 L) r3 `6 L8 m! c
H4 _7 V; L- m/ T( R( ~
if(pshreRAM->packet_cout != count_copy)
3 d. s9 ~ |; s% e3 Y, ~
{
' m. U H9 _- @' `8 j. @" p
printf("a is %d\n", pshreRAM->a);
; v4 b. t/ q% c& E
printf("b is %d\n", pshreRAM->b);
6 [9 P6 g; U! n& d+ s- F- [8 F2 M
printf("count is %d\n", pshreRAM->packet_cout);
+ E U( P+ U/ U
count_copy = pshreRAM->packet_cout;
7 U" q/ Y% Q) w0 q) s5 U- s/ I+ w/ a
}
. B3 w. ?4 A7 `! ^
else
, p# X) s* R* R% c+ M, D
{
, i2 n, H: e J n# _* s
printf("No effective message!\n");
0 n) B- l/ H+ J( Q H
}
! C% H( W8 ^. S' Y" \+ [( l
}
( H' W; K t7 L4 a: n- Z" I8 b
/ ?) |5 c, Z: X) _ ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 W3 m. g4 Z1 F! ~- j$ W6 M
- V, y- h4 o$ d- W, n
& v+ \! r/ P. o% L0 H' k
' }+ @* ^* M# D% {9 U; f& Y" ?
/ ~' N/ m8 h; ~# F1 D7 O6 V; g
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4