嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
$ m: |5 o; Y) t4 e0 O
& P. K! C& c8 X$ P/ Q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 `, l8 a& L4 v2 {
#include <unistd.h>
7 M4 [2 Q+ k, C/ m- Q% h
#include <sys/mman.h>
% C7 o* U+ O0 o! [8 J2 Y( _' J
#include <sys/types.h>
* G) m c y* r9 F
#include <fcntl.h>
W- Y5 p* N$ Q y, p
# x7 h( y8 U) q* h$ I$ A
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 l, I) h( e0 @) r
4 Y- L7 V4 f6 C2 Z
typedef struct
1 E4 E1 g9 \2 x0 T7 i' h
{
" C+ T. u; I% P# g+ N
unsigned int a;
7 ^, J. r: `* _/ B* H) I
unsigned int b;
# t% t* N1 ^; G( W
unsigned int packet_cout;
$ e( B H, ]: J" l* V% H# k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
E+ B5 i8 d1 V# q; l
# Z- z# _2 A1 X0 Q! b# s0 j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 X2 b* z! l) Q9 C6 I
unsigned int count_copy = 0;
/ O$ l: Q! I4 ?, S3 g! }! b0 K3 U
! \ F' a6 d: b3 n( q
Y9 N C0 p$ j' @ |! K# A6 U1 h
int main()
8 R; l L4 V: q; Z& {( e" M1 A8 i
{
" V* c, h; T( F6 n! m
pRX_MSG_PROTOCOL pshreRAM = NULL;
( v ? ~& i, b
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# @+ Y! v+ J# b" r
- w$ }5 I1 h1 s9 f9 z- a
while(1)
- ?+ f) d& N. `9 e
{
0 G( M" f7 y2 u; H; }
read_MSG_buffer(pshreRAM);
) f2 T1 ]& X& Y: G A
}
+ B7 e6 n0 e: u- r: V: J
}
" Y; i2 T# ?$ Z! u) R( k
+ C. [/ |) j9 B1 J: G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- y7 B3 r. d5 Z4 Y0 I* L$ u$ g
{
' g# e! c0 ~6 X7 E' s: v- l# i2 k; ?
RX_MSG_PROTOCOL buf;
* S9 E9 H" Y/ w# Z" K
. Z* z$ G# z2 R. S/ {/ J; n
buf.a = pshreRAM->a;
5 b: K8 y6 n, ?
buf.b = pshreRAM->b;
6 }: f0 u, J/ ~* I8 U$ W* b& d
buf.packet_cout = pshreRAM->packet_cout;
. e; Q3 h& d: b7 p9 Q2 Q8 u
3 X# W% a( m% n+ b u+ h& Q% J
if(buf.packet_cout != count_copy)
6 G! \ x- `) s7 Q W
{
, R x) v$ Y# R8 h9 g7 h
printf("a is %d\n", buf.a);
( S. ~; w) J: B8 [ x
printf("b is %d\n", buf.b);
3 ]; z' @9 }5 k4 x" k) A8 ]
printf("count is %d\n", buf.packet_cout);
0 \0 |" ~! X( K7 O: D: D
count_copy = buf.packet_cout;
; u9 t1 |' L: D, P4 p; f$ I- v
}
' Q4 {- m2 a+ v4 X
else
! f0 r- d& S5 c& h! s* A
{
% Q, r, T4 D* C" \; l2 ?
printf("No effective message!");
+ \+ [0 K4 s h" e0 {* Q& Y3 w8 b' W7 D
}
: E1 W" v1 i5 w2 ]
}
3 J x6 r1 G5 f. X
1 M9 J. F* }( r7 g' J
7 j: J! [; h( |5 Q$ l, D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
p! T6 }* J: m9 t: ^: U; _& \
使用下面代码,对内存使用了mmap函数后:
' u O6 ?" W) N
#include <stdio.h>
; a) j. t' O( `+ ^3 K
#include <unistd.h>
3 L' e& R! M" S- T, w- o, m3 t' I. S. I& d
#include <sys/mman.h>
7 T/ S6 T, I' V1 G
#include <sys/types.h>
4 d: u. w2 E( J* Z7 i. f1 k o
#include <fcntl.h>
/ a1 R, T, l: S: z4 C {) M
M. H8 ?; f) ~% D6 P
#define SHAER_RAM_BASE_ADDR (0x80000000)
( ]4 B) ~: o9 |: m
#define SHAER_RAM_SIZE (0x20000)
2 p# G$ N1 l7 R4 m3 \4 q% b8 H5 \
; E) P+ q4 F$ v( r" }( L: R5 b
typedef struct
. W- M. V: B e
{
8 |0 g; t4 z9 Q. W4 X0 Y
unsigned int a;
% N% C, ] V( ^9 I1 n* V- X. {
unsigned int b;
|6 A4 W9 x3 l8 }0 l) A/ |
unsigned int packet_cout;
) u& _* \" Z/ _! ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 Q7 U* n _# o- T/ V
L. P" z; u3 n/ p1 m1 z
void read_MSG_buffer(int *baseaddr);
: Z3 n O. Y2 `' ^* D" I
unsigned int count_copy = 0;
+ T K' y d: Q9 K6 j: y: t- J* k
8 K# v) j, i* i: w. G' y* x6 G
int main()
* I) H8 Y! W. D9 u' r; g3 T( m
{
z7 L, \- B5 G, T
int fd;
& x4 Q. P6 i; U: C
int *mem = NULL;
, J7 m9 z' [+ C4 S# m
/ j+ }, [* U, @5 A8 |' n. L
if((fd = open("/dev/mem", O_RDWR)) <0)
, C* w: N- x; |7 ^8 S; b
{
6 U8 a/ m. N# p. P" ]- N0 U
perror("open error");
. t7 p5 `2 b) o9 o9 X
return -1;
& f6 b+ ?, k8 }: b# h
}
% q6 o4 I; K1 e# b3 S6 Y1 L8 P
1 J3 | i8 p5 h# V( s7 @
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 H6 L, R% x; ^+ S
6 T0 D" q6 Z& A4 J$ ?, g8 o
while(1)
9 S5 t) d+ @6 V: O
{
f" e" X# g5 q: k3 e& I( c
read_MSG_buffer(mem);
! b m# o& |1 E
}
; p$ F1 q) m7 r1 _7 D; k8 M
}
2 P1 D" ~. ?7 K! U: \5 m3 B
) e2 a. K& U! j& h$ D, n
void read_MSG_buffer(int *baseaddr)
% J0 a- t8 h: d$ m7 p8 \6 W
{
6 b% ]2 o2 z! N4 Y* u' s
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ }1 D6 l) n: m% h$ z, T/ D
& \2 K: E) O, n g8 e
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ [7 Q- Y, N8 \7 ^+ n- r6 o
8 S% M* H W( e8 {& c, ?% @# R
if(pshreRAM->packet_cout != count_copy)
* P4 }! L. @: R
{
8 }0 E& H9 q0 V
printf("a is %d\n", pshreRAM->a);
% o7 v# x1 B9 E3 F
printf("b is %d\n", pshreRAM->b);
/ ^ C7 g1 h) C. S3 @8 z
printf("count is %d\n", pshreRAM->packet_cout);
- {( [. D( K( v) ?% _6 z6 {: C
count_copy = pshreRAM->packet_cout;
` ]' `1 F! q1 N$ f0 `
}
7 }1 h0 `5 }: k) W
else
. ^( l; m1 o$ n( Q% ]: k
{
2 u1 i" V$ N+ u- n$ I! G. L8 J
printf("No effective message!\n");
9 z9 k$ [# n$ N9 r. g! L
}
! L; r" c; e4 }' N( D/ G: V' v1 ~+ ]
}
1 u2 F! O9 k+ z) s7 Y
u8 v" C, r; y$ v- ^, M" u
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 t) k* O9 z0 w; G3 u
! t( _+ I7 D5 H
/ @' Y# L9 r% C: Y! O2 `
, `, Q' R) H/ m# K9 d
" z! q8 Q! {8 Y' A
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4