嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! B$ s! j$ ?( A
+ {" i# w' g2 i/ {
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ }5 q8 x5 w; h! F
#include <unistd.h>
2 H1 G+ H, M. j9 Z. b0 p' E3 `
#include <sys/mman.h>
/ z R* ` M- W
#include <sys/types.h>
! L! C' a7 r. S* p2 n! e
#include <fcntl.h>
! I0 h- n( ?+ F9 A) w( }
' ~- M# r: C! R
#define SHAER_RAM_BASE_ADDR (0x80000000)
. V \- ]/ ^& U# x' K
/ e% \, C/ N3 V) X2 }+ u
typedef struct
3 Z" R$ f) q8 q! E/ M! U" B0 Q
{
6 A. x- `2 L' m* t( [
unsigned int a;
& G3 L7 `% F' N* p
unsigned int b;
9 R3 w2 y& q* L% L
unsigned int packet_cout;
0 _9 C* s! M/ H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. W& Z) ?4 H N3 [ u7 N
) m6 d' c; K5 `7 b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" P1 N5 G R6 B5 J$ S3 ~
unsigned int count_copy = 0;
6 ?; [$ l5 g- ?( H# r! ^
* S m) N4 H" S0 w7 ^
6 N: X/ @* P+ B% O- s K
int main()
4 F# l! v# H% w$ K, ^) E5 n
{
3 n7 w3 n `9 @ _" _* S5 t
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 [2 F8 f: t. L. a7 y+ n* s9 m w
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 M( n. Q; m% Y
6 W8 l1 o7 Q2 u& F
while(1)
2 v. `5 E* G6 } [
{
6 j* ^* d/ W7 v+ q- c; e: ]
read_MSG_buffer(pshreRAM);
2 @* G+ p! Q8 N4 V u# M
}
G& O8 W6 c6 V% G) o+ D3 O
}
+ Q( n3 S1 x( W! C& Z
; z+ ]4 r# O0 Q" T0 c3 y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ g& Y- W: H2 |
{
" z/ m# L3 u( _4 U+ Z
RX_MSG_PROTOCOL buf;
9 h$ t+ Z5 ^' x$ @
1 n: X2 g' x* b
buf.a = pshreRAM->a;
% X2 ^3 j) @) d4 u( P6 {, ?9 S
buf.b = pshreRAM->b;
; \5 S! P* h8 {. D
buf.packet_cout = pshreRAM->packet_cout;
! g* I. A: g6 Z- ^* Q% P% v
+ k$ i9 Y; W3 \, r
if(buf.packet_cout != count_copy)
* S ^7 j! p' Q/ R% X- H* h- {6 n2 V
{
; J4 }5 H3 z$ a f- I8 s5 r
printf("a is %d\n", buf.a);
8 l+ }% r! p' r8 Z6 B) C. z
printf("b is %d\n", buf.b);
4 O l. b; ]+ W& L
printf("count is %d\n", buf.packet_cout);
6 q* h e& f. ^5 e
count_copy = buf.packet_cout;
9 n% A0 g% a" x& A( d$ ~* X1 T
}
: ]1 d& Z3 ]0 Y J! z
else
8 L# S2 ~% \+ C1 p& ?+ B
{
, V! e& l9 h3 j7 d
printf("No effective message!");
; a* X$ P( W6 i6 i/ v
}
4 m! `3 j- s7 @' L* P
}
# N5 h) G! x& G, h
; W: z9 w4 @+ P9 X" s
" ~& J, G; [2 z6 R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; K; h( t3 \: D" I7 ]
使用下面代码,对内存使用了mmap函数后:
2 [ Z' v5 _" D Z* i
#include <stdio.h>
4 O5 t* X2 b( o; ]7 \" f5 X) {: `
#include <unistd.h>
. F' r5 X6 x7 F/ P- C" r
#include <sys/mman.h>
, O. v! ]. Z, S: z w* k" y# S
#include <sys/types.h>
6 S% p, B& B3 g: A/ d) P
#include <fcntl.h>
2 p# ?" L c! E$ g( ^: B' X$ }8 }
- W" t3 w$ K6 T/ _' B
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ ?# r( E# D( \
#define SHAER_RAM_SIZE (0x20000)
; B) @0 D) H1 T1 p7 @7 a
2 G4 ~$ ^+ g* c, v8 N% L( t* R$ v
typedef struct
* t" g- Z o& H' K
{
- e9 j o$ v4 h# I4 j, l
unsigned int a;
. `# s" B% z' X9 d1 D) r
unsigned int b;
( X3 Q* C3 C$ u' s+ q0 d
unsigned int packet_cout;
7 H: h9 e' J% P2 Q2 O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& y0 O+ h! f% g% \$ }5 |
, [6 P4 g/ L i! l' {1 {1 _4 d# @
void read_MSG_buffer(int *baseaddr);
! F9 j. p6 E7 {4 m( N! P: t$ K
unsigned int count_copy = 0;
1 z) S& L2 D/ t7 k5 `+ M
7 O: I6 z2 c. P/ L0 A/ g( {, c
int main()
6 j6 S& ~$ B a
{
) l. F2 `7 ^7 D# J
int fd;
. l) R a% C% K2 c* ~
int *mem = NULL;
) H9 j& G- X2 K
7 g" `0 M4 O% a( f, F6 r! g
if((fd = open("/dev/mem", O_RDWR)) <0)
# e! a6 t7 x4 L5 ]. I% ~5 r, K
{
+ n* B! c+ H6 @+ ?% n
perror("open error");
: v1 m% H( Z! c# v8 K' [6 [8 F2 e( U" r
return -1;
' ?" e* n) P" A- x3 Z
}
' J& e4 @% O- [) p. f/ M7 S8 |& K+ G
' u5 ~' K8 j2 \2 r8 v$ l3 ^
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 E, f% |/ A b' W2 @7 D$ j" }
% M: S* Z0 u; M
while(1)
& n3 n" D0 w: t' Z# x/ x
{
" L9 S: O+ l# @7 b m4 C1 n9 ?; n
read_MSG_buffer(mem);
/ d6 p+ X p, P2 B2 u' p" O
}
0 Y, U+ }, w6 ]! c
}
& f; S9 D1 ~/ j8 C
- _" k2 L, ^7 X
void read_MSG_buffer(int *baseaddr)
+ Q* M5 M. A7 A/ O9 y3 u8 t
{
* ~# E. `- \( [4 x4 W$ n
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 [* [, K( D2 H5 j7 U9 p( |0 `
8 Y9 ?) H8 n# t: |& o
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 M( x3 c% L( F' ^ i8 T G9 C& o
9 n( r; I, ^7 D& w: A: U
if(pshreRAM->packet_cout != count_copy)
* V- R" [+ m2 u, t B; Y
{
! }$ x# ]1 n3 I
printf("a is %d\n", pshreRAM->a);
" p' l4 B& j1 z5 Z
printf("b is %d\n", pshreRAM->b);
2 J3 b! [ @9 J6 P, P4 K$ k
printf("count is %d\n", pshreRAM->packet_cout);
8 c# G. e( z3 f4 X
count_copy = pshreRAM->packet_cout;
9 s$ r; b& Q# f8 p2 s P3 k4 `6 s
}
& o; u4 M; \, x& E$ ~* D( ?
else
2 a- h- X$ k7 j7 \$ a1 e( A
{
: l8 b" [& w8 T. b* p
printf("No effective message!\n");
' H+ T" C) H3 t( D3 V
}
0 r5 ?3 [: V0 [5 O/ r# y, {& @
}
' k9 d. C/ d& `% a5 x
; B1 Q5 [( F2 ?& M ?& g" ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 z8 _' ]& M4 m5 \0 e$ d
; F: S {. U* N3 G
# W* M' Z) s- |3 i
6 @8 }6 f+ W( w
/ U" C: P: d2 Q+ ^& T0 R
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4