嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) f1 U: @( \8 Y
* A( L! Q6 a: k7 {7 W& [' d
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) ?+ }* I7 a8 e
#include <unistd.h>/ V$ \, O$ }1 u1 M
#include <sys/mman.h>8 U; F% n+ i2 |+ y
#include <sys/types.h>
* y# f  m$ j( ^9 l#include <fcntl.h>
: H" h( Q+ v: \! n: [
7 c3 p; G6 ~# l- m2 y; e% L  q# X#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 r8 v+ e' k1 V3 l$ k0 _# k4 a

$ `9 I2 C' u+ dtypedef struct) Y9 Z9 b' F+ n4 Z% H# e
{
0 B/ ]/ s+ ?7 D0 n- ]9 p* m        unsigned int a;
9 o8 A$ F6 t4 n1 A        unsigned int b;$ F3 r3 T7 C# o7 f! W$ B3 x
        unsigned int packet_cout;
& L0 X% Y! V- N' A1 [- ~5 w' Q! s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- W! d8 B  }$ F. C
) ^. q- A% F' Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 h2 l- F4 z4 C/ e
unsigned int count_copy = 0;1 ]2 X8 Y% R6 E6 `7 p4 _' F2 i
* D  h5 h6 C7 y0 J0 d# R
# q4 O; Q2 R3 n% ], _( ], q9 `8 S
int main()
' w3 d3 n" q5 u: l. I. [6 b& y{2 S6 B0 \, P; c1 n! w- h7 ~; U3 t
        pRX_MSG_PROTOCOL pshreRAM = NULL;
. t7 I# e- u2 ^% G. f: W        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: `2 B! u8 l& H. Y3 u4 k2 D2 \' ?) {, {+ {# j
        while(1)2 s& D, ]9 ~- |% U; G$ h' Z$ ]
        {
+ J0 E' G4 V* g: w8 w3 M/ F9 [                read_MSG_buffer(pshreRAM);
9 A6 @5 A: a6 \* I! x' Y" m        }                  V( ^" F0 Y5 B
}& b0 Q) |3 f/ W& n, B* R+ W& V" ^$ j
$ w- P: h( f3 t9 p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" N. h) I- m' M! {& I0 s
{9 l/ L1 j/ r; h' U* o* Y
        RX_MSG_PROTOCOL buf;4 U4 l! _! h4 g
        
' D- D* L: p# B/ b9 X        buf.a = pshreRAM->a;
* y* ]# f- Y$ D: z& x        buf.b = pshreRAM->b;: }! C: s9 [; \4 b  {  n! ?/ ~
        buf.packet_cout = pshreRAM->packet_cout;# [% n$ W: M2 a0 p7 d, q
        
& g1 q9 d% e6 g# q: z        if(buf.packet_cout != count_copy)# z7 `' Y. \. G
        {
1 ?8 _4 k$ W/ u1 t; X, v( E$ A                printf("a is %d\n", buf.a);
) y9 K% Q, ^1 S                printf("b is %d\n", buf.b);6 z+ H+ E, ^, d8 A" K
                printf("count is %d\n", buf.packet_cout);1 ~! f5 F, |' _- E8 \% u  F: `
                count_copy = buf.packet_cout;
) _9 z8 w. o9 E2 M/ u$ a        }9 m# j* s; j1 B* Q" N3 j  u& C& S2 i; r
        else+ ^1 b- S5 k# {+ O7 @
        {
9 `5 K3 m  A0 u                printf("No effective message!");1 d: F6 y' g9 }6 [' C* P
        }' Y% k9 ^3 A  s4 Q
}
! Y% l0 O$ r: E, I2 U: R8 ]) z& T3 [4 d  a& E

6 z1 ~' p2 c) ~/ _) n但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% a8 y% o1 N+ R* n2 V
使用下面代码,对内存使用了mmap函数后:( b0 ]5 J2 g' w
#include <stdio.h>
' ?' [8 i8 T2 X+ s#include <unistd.h>
# X4 F! w7 j  _  E& k( u- ]9 B( P* _/ |#include <sys/mman.h>7 Q" t9 \& T* w. g
#include <sys/types.h># J5 N4 L+ O, l" q
#include <fcntl.h>
# Z8 b; G* j, X7 G) h. x3 J7 c" p2 ]
#define SHAER_RAM_BASE_ADDR    (0x80000000)0 U; j( j( j' d
#define SHAER_RAM_SIZE         (0x20000)   
, W: H" J0 i: ^/ h. \! Z3 s0 [& k; t
typedef struct
6 Y8 s% W0 A( v, t% V1 I; N{
6 |" s4 x" Y" d% g9 A7 T        unsigned int a;
& X6 _$ X, I  A0 ^9 g        unsigned int b;% q* s6 W$ F" R- G; W, q
        unsigned int packet_cout;* N" l: A  u' _0 T1 d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: k+ c+ y; {  u3 Y& ]
! w" H2 E; n- a* O4 F5 b" ~
void read_MSG_buffer(int *baseaddr);' Z! |6 w5 [5 g. J0 E1 q
unsigned int count_copy = 0;5 [% x( Y" D4 ^! J: R0 U3 y

2 Z4 y+ |/ V1 ]: ]( Q! Y9 U; uint main()
" Y2 g3 c8 q* V7 x( d9 C+ k{0 j# h4 A+ o# O
        int fd;
5 ]% S# T, O  y3 r) C        int *mem = NULL;
& `. x4 ]$ V5 X# R3 t, D4 V; C5 S' A* N0 e8 n
        if((fd = open("/dev/mem", O_RDWR)) <0)
8 g8 `( v) W# G- e; R        {
+ K2 E/ R' G3 f: y* b( `  B4 X                perror("open error");2 {8 |* ?! v/ s( x  I% F
                return -1;- n; g& x8 G% G
        }
  Y0 U3 I1 ~9 Q, R% f$ D" z        ' f9 T0 `7 {" h0 G
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ P0 H- p7 x' S; o  v
- D$ X- B" C4 V# M, G! t3 D  }0 a
        while(1)
( ~2 D: ]! N2 X/ ]/ o8 q        {: G) q1 m( y6 X) x6 ~
                read_MSG_buffer(mem);, [/ s+ Z( ^# }+ I/ j& c
        }                : x! \' M, ^! f) h  [+ F& P
}
% T% o  S# [/ x, @9 g0 M( A" \$ V+ K' P3 x
void read_MSG_buffer(int *baseaddr)6 u1 C/ v7 K* Y% n" R
{" E" {) Q$ n& M, A/ e
        pRX_MSG_PROTOCOL pshreRAM = NULL;6 B# Q2 M! w( o, f9 f
' O0 k2 m: r+ c. V
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 V7 @" G( G+ ~2 u* `9 T

) z* n& ^& C  X# [9 F. j1 l6 v        if(pshreRAM->packet_cout != count_copy)$ s+ H. @; \2 N5 x( _
        {
8 ~& N' s2 S0 `" [( z; x0 J9 f                printf("a is %d\n", pshreRAM->a);5 \, D4 I( [* j  k: K, X
                printf("b is %d\n", pshreRAM->b);
( J# l; K/ u1 Z                printf("count is %d\n", pshreRAM->packet_cout);& M& B7 o& b0 C- V# m7 B4 m( A
                count_copy = pshreRAM->packet_cout;! i* c& A; ^9 R+ @) _
        }6 v, P! O: g3 s0 p. A8 v" e1 |! r
        else
4 ^* P$ r; e! u! D        {2 R& M/ k8 I5 |$ i) Q! x- o
                printf("No effective message!\n");: p, s( x( @+ C: A  p
        }
9 S# Q% I& [. H9 b9 |8 A}4 H* d- S' T; Z, p5 q

- h" N) l# G. X( L0 X没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, |/ e- s8 B1 D
3 J" F( C- _! W) l7 b, k( t

6 G* a4 E! R  U$ s8 ]3 s7 F
6 P( V/ T3 ^7 r* P! M% C. n6 V) N0 K& ~





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