嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! V* C! |) D3 b) {# e9 P
/ r$ _) X9 o4 h
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" Y' Z* N. P! M; ^$ Z* L. x4 r
#include <unistd.h>
" f% Y4 e6 X6 |: ?( z+ }
#include <sys/mman.h>
. c2 D# F' v1 n _
#include <sys/types.h>
8 e9 S' A% f/ ^& I" k N) T, I0 \$ k
#include <fcntl.h>
/ ]/ d4 G1 y0 {# r6 z" H4 n. y
/ N* W4 g* ?) d9 T H
#define SHAER_RAM_BASE_ADDR (0x80000000)
, ~! d0 s( Y2 A; z1 N' P/ Y
% P, {. {0 D( h% x5 {
typedef struct
0 ^, w3 A; z) z4 K2 {
{
( h" }6 P7 v3 U$ H4 g( n
unsigned int a;
% x- D% ?) c: q" o X
unsigned int b;
$ E. o& W8 g6 k' r
unsigned int packet_cout;
8 F# V# g! z& r0 j2 }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% a0 P( n7 [ }. ?) K* y
" F' D3 A9 l, E: r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 u4 w1 v- i5 a; d2 f( n$ Y* C
unsigned int count_copy = 0;
; k; A) m0 p: N: R6 b
, d5 `2 B: M/ l2 t$ f# @7 E
, [& V, _0 `$ {4 r# a* R
int main()
/ t- y6 N; O+ [/ c H
{
( X/ A5 T ~+ ^ g. |
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 z2 @3 }, M6 v; j* {% g
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; g2 N( u0 ]2 y: h5 t; t9 L" T8 u
: ]. ?6 h' v7 S' y5 m6 E
while(1)
7 {0 ?2 K' t5 E8 F; Q/ x
{
* ~$ a% h& [, T& I( i$ l/ q2 c& q9 {
read_MSG_buffer(pshreRAM);
+ L4 k: f* D' K, l1 P* ? L
}
3 @. W9 s- `! |! \: Y
}
, @' Y/ n& U; K! B
a$ |! [4 I; a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" Y F* {8 b* q- O" @9 q/ L# ^( S
{
/ p* l7 W! T! ^2 M
RX_MSG_PROTOCOL buf;
# f; Z- ]# r0 ?5 e" L
4 E1 [% u* h; i, G1 P$ {
buf.a = pshreRAM->a;
& T8 ~& @. e* Q! n3 [. t5 M
buf.b = pshreRAM->b;
e! _9 y4 M" |0 U5 d* w
buf.packet_cout = pshreRAM->packet_cout;
6 \* P& e( b: o, B/ d O
/ U$ ^; z- g, l9 ?9 z# [+ r
if(buf.packet_cout != count_copy)
( B/ P. S6 f/ d2 r8 Y& Q% ^
{
4 P: |# l7 G/ w9 X8 ^ T! K. N
printf("a is %d\n", buf.a);
+ C/ K* F9 T# S. Q: c
printf("b is %d\n", buf.b);
0 k5 z$ j+ \% w# t( r
printf("count is %d\n", buf.packet_cout);
; I8 L) w: S3 t
count_copy = buf.packet_cout;
6 @$ n$ q' e& f1 O. _& k) y" @2 ^# z5 b
}
- q3 O z8 _$ M, W
else
+ {7 b( R, g8 G5 c* m1 R7 l
{
5 j0 X' o1 M+ ^/ S
printf("No effective message!");
f" O( ~+ i" u; i+ |- W
}
! o0 g+ X _: j/ u1 n. b
}
! K& R1 S% c+ r: C
" K# v% A b9 H$ i9 A5 Z, x9 k9 a
6 z8 w) y( p6 C& Q5 A" f
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 I, n+ x6 \: z; ^6 |$ q' |
使用下面代码,对内存使用了mmap函数后:
* |5 j9 q9 b8 Q5 Q; e- r J
#include <stdio.h>
+ n$ L; H! G0 J1 ?, D
#include <unistd.h>
7 V- S: x$ N4 |. N- O3 k* U
#include <sys/mman.h>
5 j. M4 `' d" v8 f: j* x
#include <sys/types.h>
6 C$ o5 F: |4 ~' j
#include <fcntl.h>
9 }: P4 |8 ]3 C& [! M6 L" A
0 S: Z9 X# R) E6 ~5 G( O7 H+ x/ o
#define SHAER_RAM_BASE_ADDR (0x80000000)
A0 u2 i% ?) f" r! K" T
#define SHAER_RAM_SIZE (0x20000)
- Q& }! X8 K0 r$ \& Y/ x
5 S: S- F7 ?4 E3 |8 u4 P
typedef struct
! B% p s7 R/ c2 N& R# I
{
9 b8 f5 i% b$ e( m$ g2 v
unsigned int a;
& c) w/ C- H% j
unsigned int b;
2 j' e1 l' g+ i0 Y0 @6 a
unsigned int packet_cout;
& H2 c+ {6 l3 N$ [* `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 z8 @3 M7 @% U3 d- O
' D* j+ ~, }1 {4 J' K( {5 u1 y
void read_MSG_buffer(int *baseaddr);
4 y- g3 r) h! K9 w/ j
unsigned int count_copy = 0;
* ?9 r b$ K& U, _
- ]& P9 e G' H: |( d5 e. V( \
int main()
6 q; j& O q$ ]6 g
{
8 p, Z9 j6 L" g% U
int fd;
- k( N$ I8 `6 K* a0 ~. ]
int *mem = NULL;
, @2 ]& }2 H$ s7 v9 J, z. S' {9 V
, a4 ^9 ]* U% O- R( o
if((fd = open("/dev/mem", O_RDWR)) <0)
/ M, c6 ?- M; U9 S; d) x
{
1 P2 w5 P3 B& Z, }$ f
perror("open error");
! e! B0 u' b; X: J7 {5 n; R" m6 \
return -1;
5 w5 |# j, |2 z- t
}
2 ]9 k* p. K% L% \2 E* e
- U0 a5 ]2 h! R3 w% A; a
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 C7 x* C4 O5 B$ f# L
. f3 }7 G4 N! |- P9 a% z
while(1)
- P0 w$ `3 \# y3 ~- E( o. s
{
2 J( G. p( }7 V% c& X: l& A9 n
read_MSG_buffer(mem);
% C/ ?0 j1 i5 a/ K4 x0 G
}
! |9 M# q% S( y& d6 w
}
7 R' z0 a, X& S
2 g3 t6 i- X5 P# ^5 l# d0 ~& g
void read_MSG_buffer(int *baseaddr)
$ y/ V# Y9 R) n# E- ^& Z
{
7 @' G3 c* c8 w2 G2 o" {9 ^
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 N! F" a# I9 U& x
! a2 o9 n3 q8 T# x
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" ]) Z: g8 y( e* @
0 r! T2 M, n4 Q$ p6 @
if(pshreRAM->packet_cout != count_copy)
! b3 v, t2 r( t5 j% M+ ~* l/ L2 X
{
6 A1 W I8 ~. B
printf("a is %d\n", pshreRAM->a);
% h* @. `( }7 Q C) b: @
printf("b is %d\n", pshreRAM->b);
6 K# n& m5 A, A# [
printf("count is %d\n", pshreRAM->packet_cout);
9 h' l/ }+ s6 I# ^( X) V8 S
count_copy = pshreRAM->packet_cout;
6 A3 `. [- ~& M2 E
}
# A. E# f' K& `/ m o) `
else
+ p- z" C- k9 F9 G
{
) v# i4 Q9 O9 T5 o$ H2 F
printf("No effective message!\n");
, D. R% \+ Q9 A& w6 v0 |( b
}
{) y$ b) I8 i$ y% X4 W
}
( h2 t4 _) d& v9 c! O( g
/ Q% N2 T9 a. W4 q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; B" ~& Y s3 ^5 Q
. g( |5 T+ t5 V* A# I
, F2 K7 Y0 Z; M' V! Y* n4 ]5 J
& r' D1 v( [3 c+ d$ ]* R+ H
% u Y& ^; W* T1 U' g
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4