嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 }7 ?5 x9 @, G& U3 Q4 f! J
$ q" O6 G& ~3 l( @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 W3 o6 k) [9 m. s7 _8 a* S
#include <unistd.h>
# @0 z3 l8 q6 @; l
#include <sys/mman.h>
! \+ z, k4 w, T: V! U' Z- R! w
#include <sys/types.h>
5 Q% J! U" }8 O
#include <fcntl.h>
1 c) n* \ c4 k, w
7 E8 h8 d4 z1 Z3 s
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ Y+ o- E0 Z' M" T R+ [) |
: K3 P6 p- b' D/ f* _9 e% I
typedef struct
. a$ X# d9 D1 b0 m# D
{
8 \0 m6 x8 F4 {0 i. {; g- m2 K1 ~5 M
unsigned int a;
+ y) M0 d9 U9 D( [* D$ l& T
unsigned int b;
! W2 W- S8 k3 g/ N# p) C
unsigned int packet_cout;
# c" o- z7 i3 Y0 ^' q! s k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 z# H# k2 r1 [* n
* K0 R/ P+ |: U8 O0 b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 N+ W% b8 ?9 o: k( z
unsigned int count_copy = 0;
a& U# X) n" I) d3 U
( N: V6 C& `% m
7 h! c5 e$ o8 r
int main()
! L. [& r& h6 @' w n6 z6 b
{
+ J6 Q' d8 o! ?& u6 Q
pRX_MSG_PROTOCOL pshreRAM = NULL;
& q/ q& |, g- m3 `" `! O
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ Y/ D9 V7 G) n
; T! v. C4 \6 k8 T8 M) l
while(1)
& x& [; I6 |2 c5 @/ V, S4 x
{
1 ?, [( Y' W3 T; Y% A1 n9 W1 _* b
read_MSG_buffer(pshreRAM);
7 e7 x/ a; m, ]) U; ^5 C2 Z6 T
}
4 e; s4 B( @# J3 i0 h6 w
}
% W6 t. W% ~% {2 s
0 J' L6 K1 Q2 B' ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( P" e( a& D9 _
{
$ D. w$ i; V$ ?
RX_MSG_PROTOCOL buf;
5 H# P& L" X' v! H% s, A
. W& f# W0 R& M' P
buf.a = pshreRAM->a;
+ C2 x6 i/ C/ o: L: Z
buf.b = pshreRAM->b;
7 s" k% U) [6 g) W$ [) H3 c
buf.packet_cout = pshreRAM->packet_cout;
0 j% o2 C3 n* \7 A
3 a" D+ s7 J5 n
if(buf.packet_cout != count_copy)
7 s2 y6 ~4 S: g6 F0 q2 ^: m
{
. \8 I+ ~/ K5 ^! W6 T
printf("a is %d\n", buf.a);
8 C1 \: q" L1 V" ~2 p5 y
printf("b is %d\n", buf.b);
5 |& S+ n. j/ z: s+ V9 O
printf("count is %d\n", buf.packet_cout);
( M. J5 a$ |7 O1 @3 B8 y
count_copy = buf.packet_cout;
6 U! z# F+ j5 f) h7 @2 e( ?9 A/ i9 _
}
3 U" ~4 W4 B0 ?) N% e( U }
else
3 I |# w# O8 O
{
( R$ `7 R% a5 p
printf("No effective message!");
* C* ^6 m$ N; f, _1 ~) c/ z6 K
}
: d! b% L/ B2 J' C$ ~4 H
}
; L9 s- h& N7 u# g2 i
# j& q/ ?% {6 R: _7 G
: z5 m4 l/ U( x+ `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' M& G5 H* V& H1 {# @& q
使用下面代码,对内存使用了mmap函数后:
8 @0 o- m5 ~4 T8 ?8 K5 Y5 S
#include <stdio.h>
, l3 A! Y; y0 Z/ M* E2 j l* M3 b: ^
#include <unistd.h>
; E6 f7 l1 p) `# ~
#include <sys/mman.h>
& j( w1 ]. H9 F0 H# P9 d% v9 D' o
#include <sys/types.h>
# K% F' `/ E/ z g) V' K
#include <fcntl.h>
* R+ Q8 x# o' X$ w* x- I- r
+ f% u5 }1 d! V1 u E3 r, m# T
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ D8 w+ B9 e% y/ e6 m+ K3 r
#define SHAER_RAM_SIZE (0x20000)
' m& T2 ]1 z' x
) u! s2 B- v1 J$ [/ u# R
typedef struct
( H& r7 b9 m, O8 G# N* X
{
: N/ u) K! Q# {8 p, u/ V
unsigned int a;
- E8 b" ~3 \9 @9 P% V2 T+ I0 s& l% R
unsigned int b;
8 G2 |4 e/ @' b. f% a% i/ q) o6 J
unsigned int packet_cout;
- @1 v/ _4 E6 ^; @0 \" L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 D& |0 n( n# W; @# A+ o! t5 Y7 _2 R) _
. ~2 k( {5 L# n/ W+ E( A
void read_MSG_buffer(int *baseaddr);
) i1 s4 m" i, r2 E' e
unsigned int count_copy = 0;
# N% c0 Y$ J8 `' U! _2 A
$ F9 O6 Z+ n' k% C) i0 a
int main()
' n$ K6 U p. r
{
/ K4 n+ S! a3 R; O# a+ K) M
int fd;
/ k& d9 w3 j* c
int *mem = NULL;
7 r7 E$ h2 ^+ e. s, H/ o
" B, E! p* o4 O! K9 i
if((fd = open("/dev/mem", O_RDWR)) <0)
& V8 n6 G! b, b5 B6 r5 p
{
+ Y, ?; H3 t9 h% M. g8 j& }% ?
perror("open error");
( E6 p2 j2 V' q% {7 d. N, W4 h
return -1;
5 g' h; s* D4 V+ {; d
}
! n& a! K% @% Q! z/ l
3 {- P4 Q& y8 v6 ^! ?( p
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* Q) ?# T/ p6 ^; ^& w
0 v2 H4 K8 `: Y7 b1 ^1 Y
while(1)
, N) R {$ H; \+ Z6 x3 F
{
! z+ W: `) [( [3 Q
read_MSG_buffer(mem);
' L j# N" l3 Q% u0 O3 l
}
& u" \% K. {, M+ I9 ]% t
}
8 T9 _- d. f t
/ k% ]8 u; P# U+ b# A
void read_MSG_buffer(int *baseaddr)
+ b! a) n* s8 G, K% F* p' N' A; w% w
{
$ s& M6 ~: C; J) A- @) f2 I
pRX_MSG_PROTOCOL pshreRAM = NULL;
: L/ b- J! ]- v) n0 G& O; k
" l3 ?, b5 t- [
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* r$ I n' x# \: K
+ L( A) T/ h- m- M, I: G
if(pshreRAM->packet_cout != count_copy)
* x+ V l& \5 {( B2 {
{
4 a# A* c! q E# c+ \* s1 v
printf("a is %d\n", pshreRAM->a);
5 K' Y( L) ^: M% W; O* r
printf("b is %d\n", pshreRAM->b);
z8 N( Z7 R$ ]% _/ U2 k
printf("count is %d\n", pshreRAM->packet_cout);
& Y1 ]9 X9 \% f6 V2 N
count_copy = pshreRAM->packet_cout;
3 n0 Y7 p# R# x# Y5 W) p6 v
}
0 o" i U3 G5 }/ u3 T+ t% ^
else
b1 o! [3 l# V/ W
{
+ K% v4 ~ D; `9 f( n' b3 r5 M N
printf("No effective message!\n");
! t$ ?, \1 v5 G+ J. v8 p/ d! F4 w
}
2 H" |# d% D4 d9 x4 q2 M
}
4 B ?' O- g$ J& r. a2 T
& { G- ^# x6 } W8 V3 a8 F$ i
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
L1 O! {' S7 q. N' @- P; p/ y, V6 o) W
4 @$ q5 u" t% j$ R
5 I' J3 I2 Q4 {1 g+ P
. J8 ?# V* n2 @$ ^" J7 t2 ^
* ?- }- S& q! Z n
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4