嵌入式开发者社区

标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页]

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' m2 a2 W* C: _: b: }1 L! u8 [; w$ L0 Z4 ^1 O  Z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, C6 _7 x. k- p& w#include <unistd.h>
) q) V+ x. A* a/ _( X#include <sys/mman.h>, X0 R, K1 x2 i  q7 n1 R" y9 {
#include <sys/types.h>1 X1 t4 y! O' j
#include <fcntl.h>
  E$ w8 W- e+ j& z! @  N4 w' k0 O3 B
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
' Q3 X1 f4 k9 o, d
1 s* N5 s: |9 otypedef struct" G3 r  U+ ]$ W! @* A0 ~
{
' ]& ]. P# s2 y        unsigned int a;- i! M" ~% p7 x& r
        unsigned int b;& Z3 c- }- ~6 e( f
        unsigned int packet_cout;
& `* M. @* K" e9 [* \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 [0 v$ a! E8 J! y, s" E
2 c- D, F8 X2 E/ q6 Y5 `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! o( p& ]. F5 ^/ O1 }6 I* s: h* Runsigned int count_copy = 0;3 L9 z3 z3 i3 `2 a
! n+ \7 N- n8 U; }2 u& i# F# \
, j6 g" Q) `5 N% G! ]& D& T
int main()8 O) `# Q2 n. W' s0 O
{% i4 k; s* o5 B4 }9 g" V
        pRX_MSG_PROTOCOL pshreRAM = NULL;1 U1 [" w& m; n
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 r5 h, n2 N( A: I2 t

+ |8 K7 z5 Z( k3 E        while(1)4 U& Y- f% _7 |, L9 W
        {
" L: s0 r2 D8 I# ~* n5 D& d                read_MSG_buffer(pshreRAM);
! J% r7 s3 M) m1 i" E- d% @        }               
* `, z* e1 [/ C+ C}0 a9 Q: D# q" P/ [( e( U% y
4 p# ]8 W- ^5 r; [5 E4 S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: ?: o6 j# X, }" p7 J{
' z1 b7 q( e4 d5 Y4 C* u        RX_MSG_PROTOCOL buf;; R& s# _7 X7 P! ~3 N- R
        # |9 g7 `- \: G& l6 i' e- \. J
        buf.a = pshreRAM->a;* I$ O  w* f/ H
        buf.b = pshreRAM->b;
1 N; ^4 a1 C% r. l1 V        buf.packet_cout = pshreRAM->packet_cout;
( \. T& b- a  a; G: {" q        
& F4 v( \- `, s& M0 ?& N& C        if(buf.packet_cout != count_copy)$ |+ P+ I- W! r/ q  B4 w4 b  k$ I
        {
5 W6 Z+ x) V  P/ ]                printf("a is %d\n", buf.a);6 c# R% D3 M0 j: x  e& G
                printf("b is %d\n", buf.b);
2 h1 U* |  ]  o/ R+ R+ ^                printf("count is %d\n", buf.packet_cout);
5 X9 i, h! @; B: f. N' b                count_copy = buf.packet_cout;
; n3 z, x7 n1 i( Y8 W9 y        }* k  g4 x9 U: e9 w" y0 m
        else
  W7 d! x/ s! O; r        {* a9 H1 e6 v, `. d; t3 r0 s# K7 j
                printf("No effective message!");
& v4 P$ Y* M" g- g7 A9 Y% H        }$ _4 H5 v2 j+ ]& y, f! a
}4 Y% e1 ~' T2 x- F+ R

% C# N3 t* j* I7 Y$ _2 _2 F- s  K4 Q8 |: [$ D& R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 @. r% Q5 ?1 ~, x0 ?使用下面代码,对内存使用了mmap函数后:
# @  Z* H* Y, n( [# E2 |#include <stdio.h>4 X% S* H2 \+ [1 D( A  Y- e" C5 w; m
#include <unistd.h>
# \$ A7 j) `6 g9 f4 {- J#include <sys/mman.h>: q7 [+ ^' G6 c3 h3 G0 I& `
#include <sys/types.h>7 U+ \4 \- |% E# V; I# y
#include <fcntl.h>
. _3 J9 r/ l; D) T3 h7 G! A
  z$ g8 d/ T  r& A6 i9 h#define SHAER_RAM_BASE_ADDR    (0x80000000)
. Y- R- h5 S  J  x8 e, _- s. k#define SHAER_RAM_SIZE         (0x20000)   & E- L/ e6 c7 L. J' f' }

1 E/ l8 T; k( z9 j1 u0 ktypedef struct) L# K$ G5 L1 {$ Q
{
' C  }0 U8 O) b* V# K8 |- o1 o) N        unsigned int a;
' E6 _" ], F  B4 m        unsigned int b;
. z, e6 r2 o, E7 r1 Y- q        unsigned int packet_cout;
/ s$ O3 ~6 N! V" R2 F2 i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 \0 L* y# N! q" M8 T
0 P( D7 l3 _& V1 fvoid read_MSG_buffer(int *baseaddr);. Z8 b& |2 _2 }2 A, R. u7 h$ \
unsigned int count_copy = 0;3 v% x  B) T3 l. C, _$ m% U* @# Z

1 H8 W# c5 |) i0 R$ C- ?  p& dint main()  l  u; K( A) S. ^& k
{
4 L3 v% o8 n4 p* L. I        int fd;5 @6 M' x  Y% w3 g/ ?  y
        int *mem = NULL;
9 z" G0 k% P& {( r8 [
1 {5 a6 Y4 @4 L2 A" g3 w) \        if((fd = open("/dev/mem", O_RDWR)) <0)# s9 U; ]& t, R* i! e
        {
4 ~. G# j; f. ^                perror("open error");
3 ]: p8 X" ?* s$ b. n                return -1;
4 ^3 G. F2 ~/ u& E' f4 s  s: \        }
+ g8 A0 \7 d9 X8 W        
4 f2 X; V8 t9 y% h0 t8 S1 r/ J% t' m0 ~        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( `0 N) X( o! R: M( `( D2 h6 k' Q5 F# k2 @0 G0 [
        while(1)
1 D# Q' z0 C8 `1 B        {/ X0 ?' r7 T& j9 y- ]
                read_MSG_buffer(mem);
, B% J8 |$ \; O        }               
" ~  q2 u$ p/ u}
, K! d5 l5 ~1 P, r3 g  X" T" i* \; i5 r" R9 \
void read_MSG_buffer(int *baseaddr)
, H5 M' t& ]. W5 A4 @{
7 t$ V) v# G2 `! X2 F7 F) R        pRX_MSG_PROTOCOL pshreRAM = NULL;; X7 j2 k7 C; W2 g( V7 Z$ w
1 C* G( j/ D" g+ ^+ a
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. o/ D- u6 J, c% A, t
3 r' {3 h1 E# \' M" N' M5 M; p        if(pshreRAM->packet_cout != count_copy)7 \# |3 m' _1 ]8 W& u
        {
! k- u/ J9 |6 x% ]                printf("a is %d\n", pshreRAM->a);! b; Z+ i" T4 h9 w% x* }' g
                printf("b is %d\n", pshreRAM->b);0 ^5 w+ l8 u. I2 e9 T) j
                printf("count is %d\n", pshreRAM->packet_cout);
: u. S% Z( T; z/ C! }( [4 T                count_copy = pshreRAM->packet_cout;
* q+ y8 N' k- g* f) K. b        }
( L) E/ D1 l' p/ A6 P8 U7 e        else
3 `, T! ^5 B( E- ~        {
  t6 c6 f5 o/ x                printf("No effective message!\n");: _% s3 I9 n% D1 K5 ^
        }
) Y6 f) N) g  H; x2 Y4 j- s}0 r! L0 \- D9 I& F% }

# \6 N7 E4 P3 B% D5 L( Y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ t6 V% W$ ^$ Y  F/ I6 U
' @4 d1 r  f7 |+ j5 M
2 k) ?, r: j4 D$ ^' c! x. A& Q4 x8 L* }! S+ \" O5 }

+ d+ i* c7 l; H2 {9 [# ~$ k




欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4