嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 L  x5 h' A- K$ J; W. {, R! j" D9 }3 l# l+ w4 P; c/ G
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! k7 M2 J  Y; t6 N5 v' T; ?2 ^2 m
#include <unistd.h>& x0 O: }  c- x( i) m# s/ g
#include <sys/mman.h>+ O/ Q( [* W5 Z: v, k  b
#include <sys/types.h>& R8 h( _" K) ?
#include <fcntl.h>
) p& T0 r  z" A8 P* V2 p
4 c( D- b% ?! l! C) D, e#define SHAER_RAM_BASE_ADDR    (0x80000000)   " f6 G# x( T! ~0 I6 C
* F" [  I# Y  G
typedef struct5 X) r* W2 A! O& A* B2 O
{
" Q' m4 u8 Z0 A! c        unsigned int a;
& s5 Q* S3 u: k  e9 }8 B" U: d        unsigned int b;
& s$ Y2 C" B0 R) d* N& C9 K        unsigned int packet_cout;! @+ w; C7 q0 w" K  g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. v' U; b+ M2 E
9 l# T1 i. \+ L/ {6 zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( v; }: y" k% |
unsigned int count_copy = 0;4 G/ f1 z' p. P) s3 O

& d$ w6 C+ O5 h
( z' H4 L' Q  Hint main()
8 B( x( }5 y9 {8 C{
/ R) N8 C4 N. D        pRX_MSG_PROTOCOL pshreRAM = NULL;
: b& h3 G3 {; F7 t7 D        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& d8 T/ ?6 r# l1 e0 v: |" d+ {2 R1 Q+ O$ H8 O" A" N
        while(1)
6 W# L  v( a* K/ w, ]        {
, P, M" P: P, a) N- b                read_MSG_buffer(pshreRAM);
; \( t2 o4 t- C3 N  D. |' w9 P        }               
2 u8 a; L9 n6 @}- N9 g: L5 e" R+ a5 _$ M( |
6 c( `" ^5 `; [% y3 s& q8 s' H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 J8 b4 w1 ]$ h6 K0 [+ l{
$ p  K4 \% w; ^  g1 }        RX_MSG_PROTOCOL buf;
7 Z# W! c6 g* X  B        3 X2 o6 [6 H& R9 R; `
        buf.a = pshreRAM->a;8 \# n3 A( ~& g5 [/ V+ j5 ^7 C0 N
        buf.b = pshreRAM->b;9 _- h- P/ c, f  Z+ @3 y/ c& C
        buf.packet_cout = pshreRAM->packet_cout;9 v# H, L3 x$ g. |. G
        2 e0 @' h: _: [: K
        if(buf.packet_cout != count_copy), u0 j- B7 e6 r# H% ^0 V
        {
) V8 r$ ?# m! o! W                printf("a is %d\n", buf.a);
" B. a9 J) O* c" |; Q! Q2 a# M                printf("b is %d\n", buf.b);
" K: ~* l  w2 e: o$ F1 D                printf("count is %d\n", buf.packet_cout);$ f  z7 k, z1 \7 `8 l
                count_copy = buf.packet_cout;
' \9 l: w% Q4 k& r+ W( c        }
2 }$ i3 L4 {7 ^, A7 w' d& ~5 Z        else
  S, V: Z' u* P& d+ n        {
+ X& F9 r& Y, f* K                printf("No effective message!");0 y6 ^! K" h+ i% e' {
        }
/ o8 L' p: L: |7 y}
0 z: ]1 q8 ~2 ~$ a2 T
) |/ _( O5 k. f; ~
4 f3 l' U0 U8 ^: }: }7 ?) p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 H% Y$ ~3 l6 Z; F5 @; L使用下面代码,对内存使用了mmap函数后:
" P" U7 U$ e7 ^/ B1 Y, p( o#include <stdio.h>/ G5 b, @- y: y! J% G3 Y$ n; ?
#include <unistd.h>
$ p4 ^) Z- `! n7 a& c3 {; n#include <sys/mman.h>
# N% v4 u% k; L; `7 C. h#include <sys/types.h>* z+ m/ {& _4 z' {* `9 u
#include <fcntl.h>
/ D: D( r4 u. I
) W) ]4 D2 b( G8 ]0 Z5 [5 \#define SHAER_RAM_BASE_ADDR    (0x80000000)
& x" r) m; m  O) l' }' o#define SHAER_RAM_SIZE         (0x20000)   
" A# d4 r: ~/ r$ A+ |
. m7 k) i$ D2 N2 N' o/ Atypedef struct9 U. b8 S1 ]& Y" f5 O# E
{
" q8 A& z5 E9 \, P7 j' b4 ^' j        unsigned int a;8 d1 a- T. u# O3 I
        unsigned int b;
" `# D7 R' D$ S- O7 R4 P        unsigned int packet_cout;" b* Q5 M4 T; Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ n- P8 L7 V8 l/ ^* p) g. u; l" _

( h7 j- S0 ?: J/ xvoid read_MSG_buffer(int *baseaddr);2 M4 k5 o& |  @+ n0 B/ j
unsigned int count_copy = 0;
! O- t* x3 i. [, A( H* _
5 D+ o5 g/ N9 W  `1 t% Kint main(), d. N- l5 Q, w( r  P
{' f% [  M  u. i) g; n" a
        int fd;
: _* w* s' }, T# w6 z' x: ]+ u# C        int *mem = NULL;
; E/ y8 }8 ~( O4 \& u8 z" J; O
$ D, K- Y6 [9 g+ ~! O2 e' |        if((fd = open("/dev/mem", O_RDWR)) <0)
* v( o; `1 `4 Q: X' U" H8 ~% H& m        {
8 P5 y4 _, _5 J% ]$ e# m* I                perror("open error");
! y" [: l# _$ z                return -1;/ u( j$ F4 n; e$ d1 T. |
        }
* F6 n7 F' m5 |6 b  [        
3 _+ N9 T3 u' C        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) @6 E7 u! y6 v+ P
  n, B) N! E6 L        while(1)1 v$ N1 s8 p2 S# s' ^7 g
        {' F9 e9 r- |+ i1 A( w* A
                read_MSG_buffer(mem);" X7 b* n& L% d
        }               
; a8 z0 m0 l. f: _}8 S: v: e1 y* A, ^% [
1 Q) L3 I7 _2 M5 Y
void read_MSG_buffer(int *baseaddr)
! J- v+ B) @$ Y{
& v6 M# M# E* d$ w        pRX_MSG_PROTOCOL pshreRAM = NULL;
% U) y$ F% j3 J6 f
( W6 ?' \3 p3 t        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( d5 j. n2 `  Q/ O3 L6 f# E  N" F* ^$ b1 G/ s# H, h
        if(pshreRAM->packet_cout != count_copy)
; J) s/ t' q1 z3 k; l5 x6 d: |        {
9 c- ^  h- h: \                printf("a is %d\n", pshreRAM->a);9 v' \8 l/ e1 n2 ]) j8 Z
                printf("b is %d\n", pshreRAM->b);
/ z$ z) G6 H3 y$ Y7 ~                printf("count is %d\n", pshreRAM->packet_cout);2 a3 x  |7 |3 L. E3 Q0 R
                count_copy = pshreRAM->packet_cout;
& f6 B  g; v- l3 N' e; S+ V3 H        }9 C' U) ]; v7 q6 w5 j* K
        else1 [/ O$ r. v* a* K0 i, L" r
        {$ l- ~- B: i: k+ f5 |
                printf("No effective message!\n");
: R  P, N+ A3 y* v& M        }
; l  ~: R! G, I' F1 L; E1 C}! D8 L4 D! L4 ]$ d8 y

& p: W( c. d  [$ l3 r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- p' q+ r5 T2 v$ R2 ~7 U0 S; I) z6 o$ b1 j" z( t' K  }- n

' ~0 q; v+ w/ H$ }" q5 y
! s% W5 m: Y- H& [* U3 l0 ?9 r/ n" D5 u8 X7 X3 N) r8 a





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