嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' _/ s8 K/ j1 \8 x" M
1 `9 u$ A9 E. k. z7 z7 J: I; N, c* D6 f
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 {: r" g% G( {3 q& U6 t
#include <unistd.h>
& T, T6 P, {! p8 Z& O4 E0 h
#include <sys/mman.h>
$ }# M/ Y8 N/ B+ H
#include <sys/types.h>
1 F C/ {; r0 p6 s6 z
#include <fcntl.h>
6 O2 t* w5 k7 X: _, Q+ ~
* T4 ^# [. p2 q: }# C5 x# U: G
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 l! L2 b+ \: A7 `
, E" \" i# o! z
typedef struct
6 N0 s: w0 H" q. O2 }
{
3 n" u, }) M4 g( j" A, U
unsigned int a;
" ]9 l- F: B1 G. [
unsigned int b;
/ s6 @8 X+ R# S( A
unsigned int packet_cout;
7 I; I5 B4 I; w. Y! ?1 L: X; C4 F: v* H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 b# S! ?) V1 |! T) [
1 o% ?4 F, ?$ Z" |% ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ J6 A. O- B" I; k$ R5 i \
unsigned int count_copy = 0;
' C' K. h6 E9 r
, ^! j) J9 J* q" t& ]
% |0 d2 g Y4 j+ U$ j! x2 a4 w- F
int main()
( ^( ~4 z7 w& R5 `6 j# P
{
) E- _1 V5 e. Q, M+ s# |: h6 o
pRX_MSG_PROTOCOL pshreRAM = NULL;
: g" F( M1 l- u: a2 o0 |- X9 X
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* J, F# A7 g) o' D1 E
- c4 o; p6 y7 F. O2 g" @% P
while(1)
" V" m5 o5 |9 e! o" f3 C
{
j/ z) H) M# v
read_MSG_buffer(pshreRAM);
4 P4 q- S* f) ^. u9 h5 G5 `
}
8 m3 f! n8 h0 H& P
}
& @! y: b" U1 Q; Y
6 q" k* c! e/ b5 j2 K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' J' W/ M" E0 D5 I" s2 f
{
: y B5 V& ^2 r& B) H- f; x
RX_MSG_PROTOCOL buf;
" n( e h) N9 i$ C. m
: _$ v6 p) X6 l0 n. ^/ p) ^
buf.a = pshreRAM->a;
" ~2 A4 A# M; w& H4 I* O
buf.b = pshreRAM->b;
6 F. M6 d0 }& z" A4 z7 |
buf.packet_cout = pshreRAM->packet_cout;
( Y, ~0 N( o& G3 v) N$ U' Q
0 u; a. C0 z% F+ f; n
if(buf.packet_cout != count_copy)
" p9 T' q& P# F& s
{
$ O; W7 [. X9 {1 c7 N& T
printf("a is %d\n", buf.a);
; x3 t Z- t: R* y0 D
printf("b is %d\n", buf.b);
- }3 g( r7 M- q9 a' M
printf("count is %d\n", buf.packet_cout);
8 T8 ]% s; u7 x
count_copy = buf.packet_cout;
$ G; i/ T/ }* B3 ?! O
}
6 H1 i( _/ ~; o9 h
else
0 S$ J1 F8 }: W& z
{
3 n0 N# c0 Z9 N- U' v
printf("No effective message!");
[' f9 m; n( B& l3 Q5 N
}
# F: ~3 V% n r9 x$ e$ g( `1 ?$ j
}
9 H$ R% p' Q2 ?4 c: Z5 ?
I/ u, X$ a6 ~' g1 K
6 o1 k1 Z7 Y* M& u- z/ `! E- w
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# Q6 c# M s: h b% M; o2 m
使用下面代码,对内存使用了mmap函数后:
5 P, L# s9 N; J! i) @, V3 k
#include <stdio.h>
w2 b& C( U. }* ~0 C2 ]
#include <unistd.h>
3 C9 N: q' p1 O" c a
#include <sys/mman.h>
L. r& }# G) ?7 \
#include <sys/types.h>
9 h! h1 P; `. S; }( W
#include <fcntl.h>
# p: e0 v- p: i* C( A$ d
- S2 h' s4 O8 I# k4 D0 x! |
#define SHAER_RAM_BASE_ADDR (0x80000000)
, j+ W# F2 D/ `
#define SHAER_RAM_SIZE (0x20000)
7 t- V; T6 H. v: s# S* x
8 E* q! T. @3 O0 G V0 p
typedef struct
* c8 b4 s4 d+ E" b
{
h: Y+ ~4 a3 E3 @ K$ `& l
unsigned int a;
1 w- }1 h' J2 N6 \ J o8 `
unsigned int b;
; k Z* _9 j w" |* S' i, X
unsigned int packet_cout;
' p& u- R0 G8 S; g9 |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 q& K/ Z1 }+ k+ E5 n' e) \
3 l! e: k- }1 ^7 R" W6 ?
void read_MSG_buffer(int *baseaddr);
2 r) P* y; f# t6 h; G# t% L
unsigned int count_copy = 0;
s& s: f" N+ A6 t1 C) T
& R* R! U/ n. P% C5 |% d9 ?6 y: p
int main()
9 [5 n1 ]! v6 b P. e* X
{
% X0 U7 W! D% W, o t# C
int fd;
7 j( Y! r9 S# \& | L
int *mem = NULL;
3 ~; g4 b7 u8 O3 u4 l
8 P3 s" b' Y1 ^- O* I% C) a3 [
if((fd = open("/dev/mem", O_RDWR)) <0)
: M0 d, j) a$ n! X
{
]# D6 S; a8 d
perror("open error");
0 m' U, p) P- W1 z8 H
return -1;
$ y/ X& {5 ^" d: }4 z P& a' x
}
3 d& ?( H( q/ Q+ K& {; Y
5 a( a: Z: G7 e, j. K* B4 \7 h1 R8 N
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& z0 e0 v7 O" I V* j+ T9 |
; E1 P( |8 q% n% h" a
while(1)
8 j9 i( n; ]) r/ ?
{
% k8 B d/ v+ I$ t" C
read_MSG_buffer(mem);
+ j, s6 x Y; S( q! z4 |9 `
}
4 ?1 ?. o# C3 A4 A% G
}
! V( B+ d9 M! r. k
/ n; o P* h8 ]5 Z7 U2 T
void read_MSG_buffer(int *baseaddr)
. A' K6 G3 c$ A8 g S
{
4 X' f: `: S; ?
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 C6 R0 K5 `* E- ^8 P
X( a0 R! j( o3 e( J! T' v
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" v, z/ K( h8 t3 X2 @$ d
+ v$ j: b+ t6 J8 H
if(pshreRAM->packet_cout != count_copy)
7 {$ ?, p/ {% {. R3 d1 ]# o4 b+ ~
{
: U; j; |$ T h
printf("a is %d\n", pshreRAM->a);
' U8 K+ M" g$ N- T
printf("b is %d\n", pshreRAM->b);
6 H7 W: J) f: s0 x
printf("count is %d\n", pshreRAM->packet_cout);
) Q5 K$ m; v2 c6 W- Z- O
count_copy = pshreRAM->packet_cout;
6 `. h+ L" _; N) z% K
}
1 w7 G$ V+ C6 U3 Z' p
else
. j4 c$ o1 O* I+ z: b& E* l7 T! a4 R
{
* ~: m! r4 s5 N6 r3 Y% K$ s
printf("No effective message!\n");
; t- D, i$ G. p) ?" e: U
}
8 E1 o8 J( \8 w6 W
}
. v B5 |+ \! S# V; v t
! E) I0 d4 q5 P3 C
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ \0 ?0 L9 R/ l9 ~9 M/ i
% U& U& v1 W9 S+ D( ~
( M7 @/ D: w( E/ m E
4 B- }" ]7 E) I) k4 A
# ^: x( [/ Q) l) u
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4