嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. Q' T: h0 q. k$ H" R, T$ {
- a* p* b, z g, O- e& P1 D% Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 P4 W& r7 m) R% I
#include <unistd.h>
! t; L3 U$ z4 F/ ]9 z
#include <sys/mman.h>
: M& [) ~6 F7 h. R& g( Q; i
#include <sys/types.h>
, O, v2 {* D3 Q8 {. D8 @
#include <fcntl.h>
5 o/ H. R- L% v8 l) I1 Z
) Y" w' C6 p, V* z. y$ i0 q
#define SHAER_RAM_BASE_ADDR (0x80000000)
" r# }# G+ D, z
# D( y6 W% t5 t4 Z0 x' J6 @ _& \
typedef struct
; G$ M# J1 w( g5 Q( F
{
0 v& q* J- N7 R0 I& r
unsigned int a;
1 K0 C3 W; ]/ r0 D: w1 }
unsigned int b;
# F/ x S& N) A, g
unsigned int packet_cout;
" d; U; k+ m7 M! j; R# d. w& E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! ^# W# `6 X9 a. _, d% \; c/ S
* ]3 G6 G+ X$ a: f" C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 Q G; Z2 x6 D) |2 G
unsigned int count_copy = 0;
) S @2 g# t' @5 U- d! J; P
+ o; u5 K5 r/ I. @$ Y
0 ]0 L5 H/ q( y6 f. z
int main()
- e. I3 z+ p2 F' t- N
{
' E5 _5 E0 v0 Q2 ^+ Y8 _8 y3 O5 X
pRX_MSG_PROTOCOL pshreRAM = NULL;
: _6 W* W3 ?8 a! ]' L9 C
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* G, `6 m$ l2 T6 A" w9 B: \- e
1 v) V6 H2 b# K
while(1)
3 r2 N2 X3 ]7 r; b- _' X
{
: C" J! w: J* C0 K
read_MSG_buffer(pshreRAM);
9 _0 g" _4 s: Z8 T, ~
}
" }3 S' s% u" [
}
( b8 @$ P& N$ f' H6 Y8 v
. b1 D6 ^" Y1 f9 ^- m& [5 z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 M, R/ [+ N' C/ `; p
{
- u* Q9 g% t. g" c
RX_MSG_PROTOCOL buf;
9 P; i) N( g7 R9 e5 |, A7 C
\, D" e& ~) f H
buf.a = pshreRAM->a;
% K1 ~8 g% o+ O& _' }* K+ C# Q
buf.b = pshreRAM->b;
, z, X1 o) u# z3 Z
buf.packet_cout = pshreRAM->packet_cout;
% N5 q; I* m) |) F7 r7 {" J
* z# `: u1 ?: X8 A
if(buf.packet_cout != count_copy)
! u. x4 d/ X# r1 X& N- I5 V% n
{
* E! Q' r$ ~; ~; d8 ]
printf("a is %d\n", buf.a);
4 X8 n8 r; D% @1 P
printf("b is %d\n", buf.b);
) A6 `8 z1 p# |8 N! u r, _1 e: t& o6 Y
printf("count is %d\n", buf.packet_cout);
R" v" o6 O, x
count_copy = buf.packet_cout;
0 U& p" _$ t3 x" Z9 B" E1 u4 A+ `
}
5 z8 X* c6 L& j. }
else
0 E, t1 Z% p8 T# _- N+ f% H
{
/ n( K" p* M j. T% O7 g3 Z
printf("No effective message!");
. B' z: Y3 a" M, N K& i! S
}
# u# H* j' V0 ~) S3 ^: Z+ I
}
& }& K; f. k" @! {
! } x% l2 t: j/ V8 h6 q: [
' A# J; T" N3 n8 |5 f8 S0 z5 ]
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& q7 N5 U) P" h; q
使用下面代码,对内存使用了mmap函数后:
# V, T- c' n- A3 i, `6 f: N
#include <stdio.h>
, ?; E- B V' v* M) E" e, \/ |3 K
#include <unistd.h>
$ ]3 a( \' G4 n
#include <sys/mman.h>
/ e& {% z# n0 G0 g0 K* q4 p+ k
#include <sys/types.h>
9 h4 _& q. D; B. b$ w
#include <fcntl.h>
8 N* `# D8 e* m$ G8 E4 F
8 j c: g1 ?% o0 x
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 A) S5 T K: W" `7 Y7 W; B3 {0 o
#define SHAER_RAM_SIZE (0x20000)
2 Y- g1 y( ?( E- Q0 T# @
4 e9 k' U1 i# T" G- W6 D0 s/ h
typedef struct
0 }8 G, C, W) E8 Y/ _ Q$ u9 G
{
8 T, r& p1 q. y. g
unsigned int a;
1 N# d$ q# b [
unsigned int b;
" ^ l) i5 b- N! S: [* O0 ^5 Y
unsigned int packet_cout;
: V s* {' U+ k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 @4 v$ r) ?) t* K3 S" U; \# v- B
& j$ ?+ m2 W) U% z' Y! B
void read_MSG_buffer(int *baseaddr);
$ c) `8 G% |0 l- b
unsigned int count_copy = 0;
5 h+ O9 w |5 v
3 E" {% X1 g1 u% Q/ U
int main()
5 i: U |$ s8 l# O3 v6 t! [
{
4 o+ S7 C* M0 t0 B6 n2 B$ w R0 n
int fd;
# c: c. Q' t; e( d5 D
int *mem = NULL;
) _& {: f/ H" f7 ^( G
8 _: \9 n O/ y" K. N: O/ |9 Y
if((fd = open("/dev/mem", O_RDWR)) <0)
! R8 V3 {5 {5 T: u, A
{
# r$ ?9 F) c0 w; o) q5 ^+ E; [
perror("open error");
9 X6 M" Y9 B2 W3 C( z2 E8 M
return -1;
- |9 Z2 Q; l/ k
}
. j) g' z7 L& E# T8 w
2 W: V3 q3 X d
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 h! ?+ y" k' \6 f
6 }: s7 B; f4 {! M0 |) a
while(1)
- F1 n! U& j% b' L
{
: x4 T# w- ^+ E
read_MSG_buffer(mem);
" y2 G5 Y* F; D( ?$ t/ G3 A
}
' H' l ?+ p5 Z# Y
}
* ]. V/ K( U* s: k. L& F
- W: ~! @! n3 U+ U
void read_MSG_buffer(int *baseaddr)
! U3 l$ k! U9 ~0 S) q
{
( Z$ A# N: Q# N9 B/ p+ s
pRX_MSG_PROTOCOL pshreRAM = NULL;
* Q, O" q$ p f
, Z9 Q+ \& ?1 B- Y
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ w2 f5 V( t% u7 T& {, i
3 U1 Z% h9 Q- t3 F
if(pshreRAM->packet_cout != count_copy)
( Q9 o9 J8 g' U; H9 k
{
! }2 ]6 U( I* e1 y$ b
printf("a is %d\n", pshreRAM->a);
9 H% T$ B0 n+ `5 a8 O
printf("b is %d\n", pshreRAM->b);
6 N0 X6 t$ y- a& t$ |5 `6 M
printf("count is %d\n", pshreRAM->packet_cout);
2 a) K: ~1 c) P; m3 p) Y7 Q. c
count_copy = pshreRAM->packet_cout;
1 k7 Y; q4 i: B" V @
}
1 d1 B! F8 [! ~2 N. y6 e0 [
else
" }0 L, A6 M5 i+ l9 i7 g. q
{
S' |$ F: r/ r9 t; m# f- M
printf("No effective message!\n");
1 t& q1 v# ~6 _; B- D' l
}
# y3 x5 f- s) B
}
* o/ w/ h1 \( ]5 R3 e4 Q
1 n/ T: U1 X4 ?7 L: g0 ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ g) _# j1 M# E- X; d$ q7 U+ ?
% H. D$ ~; v8 M: | h1 S
. K J. `0 g# B6 Z2 m
6 J+ F- w" h, x7 G2 C
+ a7 j* u# o4 a! u+ Y
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4