嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) f" `. ?4 @4 s' `6 R6 M) o
% U9 }! o* Q( ?( S u" s. a
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 ^* G4 D+ k/ \, q. z* @4 E# d
#include <unistd.h>
' M/ k3 w% @& S
#include <sys/mman.h>
U3 T9 e+ t! A" ^) M' F
#include <sys/types.h>
) [0 q- U$ ?0 A6 e" _
#include <fcntl.h>
2 s1 i) K% M/ X: H; `
& D/ j/ h! U! `" @. R: K# d
#define SHAER_RAM_BASE_ADDR (0x80000000)
. C O9 b& a, v! Q8 R9 U
2 s ^- n- J ]! E
typedef struct
$ @) B2 w+ o6 Q
{
& O% i- l0 R9 f: K/ R/ b; R D$ ?6 T
unsigned int a;
* n- `9 |4 \1 R
unsigned int b;
% a$ T: h/ \& w9 G
unsigned int packet_cout;
( X s5 G u I9 V! I+ M. b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* Z4 P' k1 f0 C5 ~
7 K: E" t- k, t6 Y* m v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" ^' ^( F1 O; l8 z* l# d- ?
unsigned int count_copy = 0;
) {; M" j: c I( Z1 V0 W. ~+ O
\& y3 V$ v( ~8 |+ s! `9 r
l# b3 H5 z' `' ?$ ~1 Q
int main()
% U! U- n' K" X8 H9 \* v3 D
{
: D. t4 R- d/ m9 O' p
pRX_MSG_PROTOCOL pshreRAM = NULL;
. X- N! E# a0 o, W% h. V) m
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 d; d4 G9 Z; H3 S$ H; E* O
0 c8 K) A( F# @8 j- ~. x
while(1)
/ n7 y3 L" U7 }6 f
{
9 E" K% q% ^& b6 i% l6 a
read_MSG_buffer(pshreRAM);
6 C% G. t: b: e- ?4 R3 N9 ?- `
}
& t* I: t% f1 b
}
3 ~+ i) K; k' m- p
$ ? g7 Z3 E4 H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' k2 o0 }4 D" {( c6 T
{
- Y6 @, X5 t2 y2 ?* c
RX_MSG_PROTOCOL buf;
/ V0 Z8 @* [* ?; L- H w
+ k3 ?1 n/ ], a' [2 m @
buf.a = pshreRAM->a;
8 x9 G5 y/ C( b
buf.b = pshreRAM->b;
. G) m1 Z# w- N. U: k
buf.packet_cout = pshreRAM->packet_cout;
# F# w( Z* V9 k+ ~$ H. H
2 s. K7 |8 z- Q0 H! w
if(buf.packet_cout != count_copy)
9 f/ v$ O" v3 P4 H+ e$ o$ P
{
# _; d- `. b' T/ I
printf("a is %d\n", buf.a);
% R% J8 A7 E9 W l" Q3 `
printf("b is %d\n", buf.b);
3 T$ L. X0 B& u! M2 C1 f' f
printf("count is %d\n", buf.packet_cout);
5 ^& G0 U: G( `5 H; Q7 r8 p
count_copy = buf.packet_cout;
4 B: |" o7 Q6 W* }- z
}
8 _+ w3 a7 K( \, ]; F0 a
else
y& k. F+ w0 J9 M6 @! C
{
& {% g0 }+ O, j y& |9 U R
printf("No effective message!");
) @0 W6 }, B% U+ k7 P8 H l7 r
}
2 ]7 o; X1 {2 s3 y4 Q9 e
}
1 ~4 S; z }9 m! V
! \8 N2 U! f4 c% z5 F
4 s; K+ L1 N5 p. r/ g0 b
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) d/ W! m; `+ S* u+ W$ [3 ` o1 \
使用下面代码,对内存使用了mmap函数后:
$ ?0 s0 X6 F, A2 i6 F4 O5 Y m
#include <stdio.h>
- t) a \8 |* y2 b
#include <unistd.h>
* v6 [ {7 g. j' l
#include <sys/mman.h>
( |2 L ^0 m& c( T
#include <sys/types.h>
' K; D; X* R3 Q! i2 a+ ?
#include <fcntl.h>
5 G2 M) q8 [$ X
) a$ h+ {3 z; E$ q# G3 W& z; U# g
#define SHAER_RAM_BASE_ADDR (0x80000000)
- Z6 ~2 {2 [1 T, r( C& T3 v
#define SHAER_RAM_SIZE (0x20000)
. b" T3 _3 Q& t$ T8 I7 Y
/ A; @$ G( t# Q; T7 [
typedef struct
0 K0 g4 v* b' e: S$ e4 q# ]
{
2 T b. F3 J% `" E& ~+ D
unsigned int a;
6 y9 b4 V$ I; s c- v
unsigned int b;
# M* r# n% a7 U* k
unsigned int packet_cout;
! g& _3 B; f, n5 b% U9 e: I( ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! }& X6 b' r, A+ \( D
5 G; v- }. @) R& D: L2 W
void read_MSG_buffer(int *baseaddr);
' W5 `& O1 v6 r
unsigned int count_copy = 0;
7 X! Y) \8 H/ n5 T, p
# W4 _1 O7 R" P7 D/ J, S3 a
int main()
3 v: @. y+ @+ c# h w
{
0 D9 J) Z8 v; M' ]- N2 ?4 i1 m
int fd;
; _5 t0 R. }$ @0 b5 c8 ?8 f. V
int *mem = NULL;
" t3 d/ k4 V( U1 w! v
$ C3 m: s9 A1 O) f, Z# X
if((fd = open("/dev/mem", O_RDWR)) <0)
p$ ]/ v# Z5 R
{
1 l N7 n0 K2 ~9 v) A
perror("open error");
+ m! J% _) d$ @% ?; X( k
return -1;
, w% R5 Q e- n" q+ A) ^' \
}
8 f" _6 x% V9 S9 I* M
& X: H. v' e) R6 ^2 V* o" C
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 q% s/ D! q6 Y* f
( M6 y" U# F% e9 z9 d7 E% x
while(1)
+ u$ e1 j/ O3 e7 @
{
/ n7 g6 J: e, w! d
read_MSG_buffer(mem);
; T9 C/ s8 C; r- j) A7 {" h
}
" \% @0 P3 T" `
}
, _9 A8 Q( _; x
% b A3 q- d$ c6 Q8 ^4 r3 [# P
void read_MSG_buffer(int *baseaddr)
0 s/ O: Q- K, n8 G6 H
{
. A% @. [! [; s7 W. {
pRX_MSG_PROTOCOL pshreRAM = NULL;
# j3 s$ ?1 E) `
- I4 b* H# Q1 s/ w- e
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! S N8 n1 |4 c0 i
3 [( ^; q% L$ `- t" a. H6 Z
if(pshreRAM->packet_cout != count_copy)
8 L2 }4 b0 R) D: R
{
# ~6 o( S7 r8 S' s: A/ g# I
printf("a is %d\n", pshreRAM->a);
+ O3 e) ]# j3 x' u6 @" i
printf("b is %d\n", pshreRAM->b);
; a* E' T: a0 D' K
printf("count is %d\n", pshreRAM->packet_cout);
/ _& u" c' }% u; |- }# S
count_copy = pshreRAM->packet_cout;
; i2 {! k, Q2 @7 D2 ]
}
, O# [; b( R& x0 n' g1 R) f5 H
else
, d8 P+ W0 K2 k
{
* t/ b1 Z6 h. B6 U+ C5 Q& V
printf("No effective message!\n");
9 l% n( S1 k$ B. L* c N
}
& h9 Q: ]5 y& p( Y
}
$ y0 k3 R0 M4 Q# P+ l* \, E
+ ^: E& a# f1 Y" ]: h9 d5 N: _, B% q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 W2 f8 r, Z# p `
& T l( C' y' E* ]2 @2 p$ w u
' t: C9 }4 c; O5 O6 p- ~
4 I4 c% \( {4 Y
: |1 Y4 _! r) C% |
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4