嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
$ w+ y- {2 s- H9 H F
0 o2 f- ]) {( l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 \" p( F: H: v' Q; `( N1 s8 }
#include <unistd.h>
+ r6 @9 y9 _' \( f U2 ~, m! M
#include <sys/mman.h>
w% w' N$ A4 S, L d$ ]3 L
#include <sys/types.h>
, |9 P8 b& P- w1 D
#include <fcntl.h>
: r+ h% k' B) l, @3 Q# j: d5 `/ v8 F; N
6 C; h! @/ U9 x9 d3 _# t
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 `" [8 P+ C$ e- W! J6 n
3 J+ _2 c& K* I8 \, ^2 {1 x% a# y$ a
typedef struct
! a, Q9 r9 ]" e1 j7 {& G& ^$ |) [: M' U
{
; a$ c3 a2 H( B0 o; f. b7 j
unsigned int a;
! G3 e2 o: P- q. i
unsigned int b;
/ ^ i# Z3 e# K- Z! {% A! Y
unsigned int packet_cout;
6 b: g0 F3 \! P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) k/ V( v; {/ l' J
* j3 D- c- W$ f' K" ^& a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) z6 u3 ?6 q! i. I
unsigned int count_copy = 0;
/ u5 w6 F% `9 x* x) N) L9 O5 e
6 C4 D/ n1 M/ p/ v& t- \7 a
4 o5 x8 p$ B. W' L
int main()
, N6 J& Z' u; E+ y! Z7 F6 G
{
( g& R' _) }! V$ a; A$ @1 Q
pRX_MSG_PROTOCOL pshreRAM = NULL;
& p, B! d7 y; Q! n, @
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- s' q( n4 f+ r& n
: p4 Q5 ]4 [; b$ P9 g9 X
while(1)
( ?# t. [& D: V6 a4 p/ P
{
) W' M. }, M6 h( a
read_MSG_buffer(pshreRAM);
9 ^2 ^" z9 ~" r8 N& v1 j
}
# \. p0 p8 c% Y/ g. J2 @
}
' V( K' u$ r% t0 i) x& Q# h# W
* D3 D* O8 q J) R) P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 U; Y9 E" W: f2 `0 P9 R& \
{
- _; F# ~* U) t9 p
RX_MSG_PROTOCOL buf;
3 m& p/ W; n$ {1 i' D6 y2 l
- ]8 K, r: u# z: C' ~) \9 x
buf.a = pshreRAM->a;
6 N* R6 _* Q* E F
buf.b = pshreRAM->b;
" B8 n8 ?+ c+ J
buf.packet_cout = pshreRAM->packet_cout;
9 h1 Y: U0 {/ L# J, V9 \
" a- y8 K6 R ?( \$ v
if(buf.packet_cout != count_copy)
& m1 y! S& E* I' W
{
5 C! j6 e: f/ z! f0 I8 M0 U
printf("a is %d\n", buf.a);
9 i- p0 \; Z7 t
printf("b is %d\n", buf.b);
J: _ k% `+ f2 ^# t6 H
printf("count is %d\n", buf.packet_cout);
! p3 H2 V% B8 O6 O Q
count_copy = buf.packet_cout;
) o7 Q+ `. W0 j$ p$ F
}
/ x) A3 n, l/ [8 ]
else
/ z* e5 i8 B+ r$ U/ s; l. l
{
0 ~- ^; i, d# B3 Q3 t t8 `
printf("No effective message!");
* i# R1 F2 O( z3 ?3 ~- j5 I# h
}
2 K5 O! ?8 x- |1 @/ W
}
. R9 T5 F, }& Z) U2 {; e
9 v1 i+ K7 _3 X% g
/ d9 W3 D1 F- g$ G1 V* O/ G: d
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% U$ w* I7 o* b C1 U
使用下面代码,对内存使用了mmap函数后:
) g8 e; t1 Y# D4 {. T& n
#include <stdio.h>
3 \+ z) y7 s) e4 @# R& c3 X
#include <unistd.h>
5 z$ {9 @, @% M$ w, h4 x
#include <sys/mman.h>
* R0 X( G- r2 B4 v0 p2 u
#include <sys/types.h>
1 s+ o( |$ |& m" q/ m. \. v5 z. w
#include <fcntl.h>
( d3 R- Q! w5 D+ I, [! {
5 z) g1 D9 ?8 k, y% ?
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 T$ E% ~! ^! k, w/ @# t5 ^
#define SHAER_RAM_SIZE (0x20000)
! K7 Z! u5 N, A5 j
1 E& S/ ]4 q; d' t
typedef struct
( [$ L/ q! i3 j/ U
{
) w$ |. z2 P6 y
unsigned int a;
" s2 \0 b: q% [4 h
unsigned int b;
0 O+ _5 R T! y
unsigned int packet_cout;
. P3 `. r* Z5 n6 K3 x7 r% i# z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) [: ~" Y) a5 T. y6 c" J
+ @" S# E1 a/ L4 Z. e0 m. y6 l
void read_MSG_buffer(int *baseaddr);
8 v* y" q' A; E) a7 u: s" ?6 X7 |; L6 T
unsigned int count_copy = 0;
# H) N; n9 _3 `, @
' r) s t' J; [) M4 \8 t0 M
int main()
6 L4 p3 c- [" [" X( N: z: r
{
+ ?4 O, T7 c' S4 d- C
int fd;
/ A& Z5 O9 d1 h' `0 S+ E8 M
int *mem = NULL;
: y0 Q1 D2 v! [
# g% f, J* }; P; y/ O
if((fd = open("/dev/mem", O_RDWR)) <0)
: \7 W6 I. _( \
{
5 W9 m, o& e! e3 y4 z
perror("open error");
4 P* ^6 F% K- h4 V
return -1;
, m8 C7 R# J _( @2 y) U
}
& }" O4 ^' Y: B0 b2 r
9 [* p5 A) Q/ Z9 F1 }; K! B
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
~7 J# |2 Y4 t7 ]) d: L+ Z
Z3 v: U2 ~2 V. d( C8 p
while(1)
5 B% T8 B& M! y$ h' v
{
$ h9 Y* E9 N! |5 @
read_MSG_buffer(mem);
y4 x1 y( _, m
}
, `" q7 j! A8 q1 J" K% @
}
9 [9 Z3 H3 q" ^# ?
: j& |: e6 \" `, G }% H
void read_MSG_buffer(int *baseaddr)
! y- H. m, @6 P4 z1 m M, M
{
7 P: ~0 u' Q* s2 Q
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 ?, S4 Q. g9 i' x: e# E
Z3 Y! O1 E/ N
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
) n+ o7 o# {) V( W
, ]7 t' K0 K) o* i9 ~
if(pshreRAM->packet_cout != count_copy)
/ Y4 I' G0 _- P/ C/ {/ S& I- e
{
" l* _1 ]. }6 X1 l
printf("a is %d\n", pshreRAM->a);
4 x4 d) C. G/ F8 c5 Z1 M
printf("b is %d\n", pshreRAM->b);
2 c# Y! B: X1 ]/ ]! A0 g9 U% ]
printf("count is %d\n", pshreRAM->packet_cout);
, T+ U9 O5 p, p3 ?6 a: N
count_copy = pshreRAM->packet_cout;
" N/ g' l; m7 z$ E
}
. V9 ^# J& m5 N% Z2 G; I# ]5 f6 P
else
9 x( x6 M6 ~. G, }/ I+ o
{
+ S0 R5 X1 i* i/ G7 \; d* c
printf("No effective message!\n");
* P5 U) u: w5 u
}
. Q7 ~& O: a3 B7 O+ |! Q
}
& f0 M( Q9 Q2 [3 B+ o
0 F& w) t) T% H% s6 x* E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( M$ u: b9 n% A, g, ]0 m
# y. W( T) T+ i
/ {; G! w: ?; u+ c
! Z, b# s% J8 l' b
_" y9 W0 m4 d
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4