嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# o1 j- N9 z# Y' h- w+ u
/ ?% m# W9 a! k7 T- F% K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" |% C# _$ Y$ L
#include <unistd.h>
* E1 Q6 j; j% [) _+ |1 W' O
#include <sys/mman.h>
( z( b3 r* y2 O1 o: O. V
#include <sys/types.h>
9 l* ~# Q. @, i+ a2 _+ w! O
#include <fcntl.h>
% h, J1 o5 Y( T3 K/ ?
+ W! F% s+ I6 P% S! ~& F1 ]$ F4 x/ |
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ v4 I6 z' g% }# k6 N. F
1 G( x" t* p' G3 M
typedef struct
# D9 {" g- q$ t- a
{
9 U8 V i& G$ s( H5 D
unsigned int a;
, U1 ?* N; j( x& q+ K
unsigned int b;
% w+ b4 ?+ Q4 k& ~' N
unsigned int packet_cout;
1 w& k3 R- q# S8 q! N$ r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( [0 M3 Z2 K) Z3 [8 P
$ y* M( e# `2 w$ ]! w4 \3 A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 b2 x& S7 I- U8 d/ @0 v; f
unsigned int count_copy = 0;
/ v- ~4 J* q# @! f& B8 E3 D
& m; `/ Q8 k$ S
: j- t$ o1 ~4 B
int main()
) f+ O' ?0 n$ P3 O$ q. l
{
% U6 v: E* ?3 m+ J+ p6 d
pRX_MSG_PROTOCOL pshreRAM = NULL;
. g& S8 f% g: D
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% ?, |# ]7 N6 p, @3 B6 O' a. E
1 m/ x% L6 u+ c
while(1)
$ g$ }+ Y6 k, B0 Q
{
$ R( c i9 G. C0 M2 ^+ W
read_MSG_buffer(pshreRAM);
* p }- {$ r- G% @( }
}
4 B6 t, J- N" o4 i4 ^- O
}
# A) F; @/ z1 j* G' j
$ P" \9 R9 q9 M9 F/ P: W" @: B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 \ {* T6 m' S. C
{
1 A# R3 e4 z: H8 D1 |+ j3 |
RX_MSG_PROTOCOL buf;
! U: W; T. F! k" y2 g1 S
* E9 C1 f5 h& h; }5 M/ T# j( h
buf.a = pshreRAM->a;
3 ^' N! T( i' S9 _- Z, Y1 s1 W
buf.b = pshreRAM->b;
3 t0 t* _* G; i D, ?$ {
buf.packet_cout = pshreRAM->packet_cout;
1 J( ?" n/ \ T1 e3 E, @5 E- A8 H: X
" Z0 N- j1 u9 T0 T6 b2 j1 a
if(buf.packet_cout != count_copy)
: x9 i$ w. Q9 J4 ?# W' h; }+ d
{
: V' ~ U& p: ^& n; c/ h5 K
printf("a is %d\n", buf.a);
% i" l7 S1 p& ]& q$ H, I
printf("b is %d\n", buf.b);
9 [1 \- s( o2 X, L( Z
printf("count is %d\n", buf.packet_cout);
* [. y& f( b) x% H7 B1 g
count_copy = buf.packet_cout;
) f- B9 @0 g- r/ a7 \& z4 Z
}
3 V( Y) C6 ^0 b+ n% ?+ q
else
* W8 ]- R( e7 V h! H7 E( c0 ~. b
{
+ Q/ D4 f+ A/ H7 ~7 u% ~
printf("No effective message!");
% \$ b2 s) F$ Z5 d/ _) Y3 ?
}
, e# n& r/ A% m- X! u
}
3 q+ [7 S) b/ o1 u$ L! c
% X% m: U$ T- u# Y1 x8 H: \1 c& K
) s8 o% n! d* Z+ k) B4 @
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 q ~; U, J% n0 @9 G9 ~
使用下面代码,对内存使用了mmap函数后:
( W6 A9 h% W7 _& r) A1 f# d4 D) c
#include <stdio.h>
# w0 S% T6 D6 V2 r# v! U
#include <unistd.h>
1 b; A' d5 ]9 \
#include <sys/mman.h>
. h) n W" s. [, }- z
#include <sys/types.h>
) A" y( A+ I+ }
#include <fcntl.h>
5 b6 e/ I- U% i) O7 M
0 g$ ~& a' m7 p: t* C
#define SHAER_RAM_BASE_ADDR (0x80000000)
% [; T' {( [7 [# H6 w
#define SHAER_RAM_SIZE (0x20000)
8 Z# k! f" @3 d* r( y
6 z( J8 e1 f# w6 _0 ?5 _7 @
typedef struct
9 y3 U; x. x- n! {5 ^5 S
{
: x7 x# h* `9 X5 ] g
unsigned int a;
) q+ I* I7 t/ j3 Q8 V
unsigned int b;
# s3 h' [ r# n$ E4 o5 C! H
unsigned int packet_cout;
1 M7 R9 k+ |. J/ s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
V& u1 ^0 Z/ F' ]
3 W( @3 T/ J! S6 b
void read_MSG_buffer(int *baseaddr);
6 w1 x# |8 s3 N3 C
unsigned int count_copy = 0;
G8 |9 y: Q; _, o6 }6 a2 J
, t w% L f( V& v! u& o
int main()
3 P. h6 F, Y# b# G
{
1 {5 C k K( k- [
int fd;
6 `. Q' o @; l( ^ E8 l$ g
int *mem = NULL;
+ ]* p" }! D8 I8 k& d
/ O' ], Y: b: N, |
if((fd = open("/dev/mem", O_RDWR)) <0)
2 B; v; p. o! N+ o
{
5 z# b; H3 e! K2 G& }; @ K
perror("open error");
8 ]0 g( D9 f( l; e/ W: [$ T
return -1;
9 U. c* d0 g' a1 b/ E5 a. [
}
0 l+ [# Y, T" m" Y0 O5 M8 h
3 j, g* r7 s# v5 C& C/ i0 m
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# S( S3 w) Z* ^+ a, i, B
3 o+ ^+ h$ F: x+ T4 y E
while(1)
* C) n0 X0 N- m" U; g" c
{
* S# F: }1 F, [% q$ N$ g, ^ C |6 i2 L
read_MSG_buffer(mem);
' a% R9 M" m9 h! g
}
$ W% n4 k! ?. E2 L. U b# a
}
1 X1 S: [$ i# y
# s) [9 g8 E1 h8 j! r* Q9 t8 H
void read_MSG_buffer(int *baseaddr)
) n' H7 `- ^8 l& I8 P
{
. Z! P* E- n( x' q" M' K- Q
pRX_MSG_PROTOCOL pshreRAM = NULL;
* t/ F+ z4 C [
/ e# R' y& A. A3 q( L1 P5 L: F; b. P
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. n$ D5 I/ e6 y' Y1 d# d
% B" z& ~- Q/ K; K* C0 b% o
if(pshreRAM->packet_cout != count_copy)
7 T: g1 S- u; a4 U& P
{
0 D" O- X; F, i1 r3 i
printf("a is %d\n", pshreRAM->a);
3 {4 N1 T5 i8 q' ]. I& z* }" C
printf("b is %d\n", pshreRAM->b);
8 Y% t: T _/ o+ W8 p: Q1 I8 s
printf("count is %d\n", pshreRAM->packet_cout);
7 z/ G z/ Y: g
count_copy = pshreRAM->packet_cout;
, E2 ], m' V5 C# ^" k$ R
}
% R& T8 x8 p7 v/ Y/ y3 A7 }
else
5 ^8 M+ k" {: C9 p
{
4 t/ G& _3 ~& z" z3 N7 n* Z$ T
printf("No effective message!\n");
! G) M+ Y8 l" X, N+ Q
}
, ?! Q# N: O0 n8 L# r
}
4 d& l- [* |- K1 S1 t" w k3 k
/ K/ e8 L8 s$ w, s" E3 D
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# A* ~8 F4 p5 {, J ?, h
$ ^/ v; ]* v/ x2 _4 R
3 S4 T: A7 ?+ }
- o9 p+ X, z$ v% S2 `' I
$ C2 u& W0 T) c! a
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4