嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) L! J. c0 G. C
( r0 |' D% M. g: e, _, @% r
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ W* r1 L6 @3 h" t8 ~: V5 |! R
#include <unistd.h>
8 u: {0 R" `, K" L
#include <sys/mman.h>
% u0 I& Q1 ~8 T' B
#include <sys/types.h>
1 Y$ M" ~9 ]3 @. k6 {* ?% A4 k8 d
#include <fcntl.h>
8 n. R9 d/ h- N8 M' e& h
$ ^6 B7 r4 X8 p3 \
#define SHAER_RAM_BASE_ADDR (0x80000000)
) }/ C& C2 q" [' s: c) {# o
( f4 u" a9 a; H2 k
typedef struct
+ ]$ Z) u, y1 M& Q
{
. w* W0 Y' J, ` N5 z) J+ f3 P" k7 }# n
unsigned int a;
. u) I! J1 w3 L% V8 x, e+ c/ q
unsigned int b;
8 ^! u9 I. g( S0 _
unsigned int packet_cout;
2 k3 h/ u1 e$ C0 S7 M F2 }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. d; X7 M, Z% p* G: h ]
& C7 w( c7 T2 F, ]# F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 _" V1 G! x' R1 p8 J+ {
unsigned int count_copy = 0;
% P3 B6 u O1 H2 M3 b6 Q3 h) K
" D- x6 g) {! w
1 K$ B' c9 o- Q7 ]( d
int main()
, p3 ^# `0 N# ?" Y( P, c
{
. f1 \: G6 x6 Z" y5 d% @
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ F8 U! I( Y7 N) F+ Q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ n i. c# W+ l3 t R2 |+ G- {
8 ^8 k1 C3 n9 i1 r3 z& V
while(1)
* @# ^/ o/ G3 D9 p
{
6 I3 [( ^9 U- m. d; k) w9 H
read_MSG_buffer(pshreRAM);
- A& }; C' l% d) Y7 F0 m
}
1 W, S3 b5 N* t0 w/ \
}
1 t( |5 k* V# G8 Y
8 v7 k. j5 e) d# E2 b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ Y9 p8 x l, X' o
{
" S0 H" u6 C: N; x1 z
RX_MSG_PROTOCOL buf;
b/ J9 l7 s& d
/ l B7 G/ O1 ?
buf.a = pshreRAM->a;
1 p6 U6 s8 k' _* \( e
buf.b = pshreRAM->b;
4 W6 V. w9 U* N" \$ N" h
buf.packet_cout = pshreRAM->packet_cout;
B7 `! _: y) W( e
' S9 B8 u3 z" y: C
if(buf.packet_cout != count_copy)
* \0 N- i @8 F+ ]( Z
{
$ E# X; h3 V) ]* B" q
printf("a is %d\n", buf.a);
, B+ X" f* n6 a+ X1 J1 o# j
printf("b is %d\n", buf.b);
! ]; @: b# f5 \+ r# d
printf("count is %d\n", buf.packet_cout);
* z$ Q2 E) z; G% G0 H8 Z
count_copy = buf.packet_cout;
2 L( |- y8 o" m0 l0 F5 V
}
( g B$ B- Z4 w0 a! M* x/ E8 u
else
0 X& W* J2 Y" N. s2 D/ q7 f: [" P
{
; x; c4 o# R3 Y! ]
printf("No effective message!");
9 N4 g+ a. }9 v7 Q) {- Z% f
}
1 O9 G5 X* ?2 ~' u* S- I
}
0 R. K8 o' B" P; \0 g
& k$ s; w( Z. e6 F1 A; \5 E/ W
, C, {/ B/ Z) X% S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& ?+ S& c4 n R5 p
使用下面代码,对内存使用了mmap函数后:
6 Y6 e* r: s' S7 t, V8 e; d- e
#include <stdio.h>
% J) t- A, G' U1 j
#include <unistd.h>
7 J4 I3 J" P6 h* u+ V4 {1 W$ {
#include <sys/mman.h>
8 a* @* e" x% D" T/ q
#include <sys/types.h>
0 @! h& K, l( t( A3 F* T
#include <fcntl.h>
+ O B" M; @! I
. E! h9 v' f5 ?5 h. R6 b% {, {
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ m3 C7 d- V$ x! k
#define SHAER_RAM_SIZE (0x20000)
' b. M, {& v1 t9 [
5 E; i+ K' K& U- q+ {* G) n
typedef struct
; v: L W& ~% I; ]9 d0 T+ R
{
; X' r+ Y/ G6 O6 i( ? W
unsigned int a;
1 W! T* q; [5 @; {: Y+ E' V! W. E5 E
unsigned int b;
! T7 ]$ Q3 l& b4 E, L# U# B9 }
unsigned int packet_cout;
/ p# m) O. n: W& D" T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 O* j5 ^0 X7 S+ `" H0 ]
6 U% f) H2 k/ T. \' M
void read_MSG_buffer(int *baseaddr);
" W" d1 [" `. S8 L0 S
unsigned int count_copy = 0;
% A, E1 i1 h* v! M P% l, d
- }" E! s+ ^7 I2 L' P8 {! U
int main()
. o# q4 b( M1 s* S3 J7 N
{
3 }6 b* L+ y$ [( V5 ?4 H6 R
int fd;
+ H" o& P; b; U& B
int *mem = NULL;
! v, e9 x1 M0 W& j( W! g+ e9 u
% a$ n. z4 W: z3 c
if((fd = open("/dev/mem", O_RDWR)) <0)
8 p2 p$ `" c1 O( P" L, v- w
{
8 Q4 ]3 {) I7 k/ w" o3 k5 Z( y7 Z
perror("open error");
; `5 z g' M# m) D1 T+ _
return -1;
5 O; |/ A* |- L* j+ |: F
}
# l7 U9 Q o- Z. b" U2 x* @1 l1 R
# t' h/ ` h9 g
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ Z5 S9 \4 y) F1 [/ l! s; R1 z
8 T, w& k8 Y( r. e$ s X
while(1)
" h3 h% W5 _: ?4 @4 m4 d
{
4 a8 h0 ]$ n$ \
read_MSG_buffer(mem);
! r( { E# O; N& J9 Q
}
) L* z' @' m6 {3 v' H
}
# p9 S2 g5 K2 X2 a
' {8 W1 g* F, F# E8 V7 R$ }) U
void read_MSG_buffer(int *baseaddr)
' m+ q5 ?& w3 I% N6 |0 r
{
6 \7 N6 ?$ r2 Y8 Y) b* _% b9 f7 J
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ r2 F- ?) ?( S6 C
) D. u0 y& q% `
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( Z h9 [, e( X! L0 P$ a
! O6 f% k/ F8 x- a
if(pshreRAM->packet_cout != count_copy)
) A8 K/ q! J- B6 Y$ S+ N
{
3 l+ N# Y" x& t/ w1 u
printf("a is %d\n", pshreRAM->a);
- e' ?; a$ H2 d$ r. k2 Y$ L, |( A
printf("b is %d\n", pshreRAM->b);
& O! E9 H9 M% m, {, D7 c
printf("count is %d\n", pshreRAM->packet_cout);
- M% ~0 L& ]( V
count_copy = pshreRAM->packet_cout;
" u$ d& \0 f( o2 ?7 Y
}
/ a- W# M2 _9 S& T3 C
else
: H% l ?; Z o8 F* i: D6 ?( {
{
7 @% k1 [; D l. K9 T
printf("No effective message!\n");
4 v) l# H" e. f4 M: ~
}
: R4 L a! l- `( h: U9 ?/ I
}
+ R$ O. A" u5 s
% w# X$ {4 S4 x+ j0 O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) T1 b/ X! y3 k* \. [
( J- n4 C) E) _ M
. i2 R6 s; W) J; i& t
& ^, |% w) H! S7 `+ [7 @: M. f( D" V
( ~% n2 j- k. A8 D; ^6 T" \6 j
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4