嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, T8 p$ q& q9 ?+ D! m9 ?/ r' m$ r
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% |3 t, J! f* v2 ^& p
#include <unistd.h>
1 [# x" Q0 P: @- m: i. G#include <sys/mman.h>
# s# W6 t! k6 z+ |% [" ^3 S#include <sys/types.h>
8 T% S- g/ N9 M#include <fcntl.h>
7 k4 q5 W: [9 S9 G! Q5 C! {) h2 A0 F9 n
#define SHAER_RAM_BASE_ADDR    (0x80000000)     G6 ^) L. e: \$ E6 `& O  |7 u" S! _
3 A/ ]8 Q/ ~; u. L
typedef struct
) \2 L% O) w5 E) q8 l+ b6 i. R{) u+ n2 k( c; A5 p6 N: J7 y7 R
        unsigned int a;- `) z9 g2 a& a2 O* S
        unsigned int b;. a1 C: B3 x4 L6 f
        unsigned int packet_cout;
2 V8 t' j; p6 n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ M6 P" `) W. j

' N; P$ h0 R3 ?4 d* Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- h6 K( N# N/ U
unsigned int count_copy = 0;
0 W: x+ B* \5 u9 O9 L8 y8 @3 O7 ^% a9 w
: y  ^; L; z! V! f4 b4 P
int main()( K! q+ `2 ~" j: o7 z  j
{
  b$ d' t; c/ s+ I- N        pRX_MSG_PROTOCOL pshreRAM = NULL;- }( O# V/ p" r; X* R! l+ z
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' J) v6 @9 `; i' c* j8 n: B

& v3 L3 J8 l5 }9 r8 l        while(1)
0 r" l: E" U7 p1 M        {
/ A) X& n5 A; ~# z                read_MSG_buffer(pshreRAM);$ q, c( ?. y+ _2 z
        }                . X, l6 z) k( f! ?+ U5 s
}# u, y: A7 a1 k( }
6 m& H& I  k4 m6 t' t5 o+ ]  h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- M/ Q9 U8 n5 g8 Z+ w7 N% i, p  @{3 T3 C8 U4 N- M. J4 X
        RX_MSG_PROTOCOL buf;
: U, n5 t) `0 W' x: L1 S1 [( W        * K8 B9 J8 r+ b; h9 p2 n7 {) w
        buf.a = pshreRAM->a;
# ~, Q. K$ }& _% u" c8 ~" u7 @8 a        buf.b = pshreRAM->b;
. D. [% J' b$ t( e5 q) U        buf.packet_cout = pshreRAM->packet_cout;
) h" O* ?( H+ @6 k! ?        3 D' G& }/ a( q' x8 X" T- _0 X
        if(buf.packet_cout != count_copy)
/ w6 }' W& W& k( d+ F% P& l        {; V) A3 F9 ~) r9 p  i  w+ w
                printf("a is %d\n", buf.a);
* O4 U  g* ?4 l- w7 r. O1 n% [                printf("b is %d\n", buf.b);
* W: L2 b8 e1 p- j( P" e                printf("count is %d\n", buf.packet_cout);
1 a/ o* s% k: T3 ~/ t9 E1 n! L9 q                count_copy = buf.packet_cout;
0 y2 ~! A- [! l' j        }
) T8 G" p6 F, c& ^: ]/ n# a        else* {8 U" P! Z; s; Y
        {
: ]$ S" a% `1 u                printf("No effective message!");
( l3 ]  t2 M  b1 x" k        }, Q. c# o4 C  V) l0 S0 V
}) K( |! \2 h+ ~! l$ w; b
4 M( E1 r& @" X% _3 x0 q: z
0 \4 K0 d. }% P' D) ~, q& V2 O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: b6 d/ a/ z! Q4 S* s  [
使用下面代码,对内存使用了mmap函数后:
* a6 Y+ ^9 u% Y+ K' d. q#include <stdio.h>
+ t# M) a: s  @2 k# C6 L2 p#include <unistd.h>
" J" E' K7 F; E1 w- k* F4 o/ J4 B#include <sys/mman.h>
! ?2 v7 H" E% _4 Z6 O' m. Y#include <sys/types.h>) Q8 A2 g8 s" [. v% G0 A
#include <fcntl.h>( ?- E/ u4 f6 @2 o6 d
$ |2 \' N3 M3 \6 w
#define SHAER_RAM_BASE_ADDR    (0x80000000)
% B( _& [1 e2 ~" k#define SHAER_RAM_SIZE         (0x20000)   , {3 d9 l4 q$ |& [

+ \8 Q& B: [, H' |7 R! V& L* Otypedef struct2 \& W$ E: W' N& y- j7 q) |0 B2 Y
{# [, @! X% `7 _1 K$ h8 u+ K
        unsigned int a;/ J" j/ a8 y, S) Z0 z- I% Q
        unsigned int b;
0 @8 c7 f2 S0 C/ I0 S. {* ]        unsigned int packet_cout;
' T6 ^7 U! E; q* {' x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  b  |: @  ?2 M
- D! \, y7 L( C4 ovoid read_MSG_buffer(int *baseaddr);, ~7 A: S3 @4 @$ C+ e" Q  P$ A
unsigned int count_copy = 0;. B& t( O4 K. f: X  }, x1 R
' k" X. F- Z5 W) k
int main()9 @, O1 u3 a) Z9 x
{$ I% C6 H/ o3 M2 p; l
        int fd;
. I2 X9 S( O' f        int *mem = NULL;
  K: T, F$ c5 D  n9 O% X" `# z
* ]1 `8 q! v0 x# H" P0 {  P. _        if((fd = open("/dev/mem", O_RDWR)) <0)$ L) C; d2 d1 o0 F
        {
2 u& ~$ t9 B. w4 r. Q+ D+ u4 G                perror("open error");
% I/ m0 I- f; f' k0 T) G7 ]                return -1;7 V2 e" _. i; k8 [5 F0 _* b
        }9 }3 B' J% D/ x0 {7 |+ |
        
/ J2 X. e* @- F# _; {9 G/ U. w        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 @% t, Q% [8 `2 e2 Q

6 o) |0 r) O% Q0 y% j# H        while(1), S# d* x/ V: |) o! o5 ^7 r2 l$ F/ K
        {
* b3 ^( G" g+ z  P9 N! D# k                read_MSG_buffer(mem);* G+ |9 A# ]  J* _$ q
        }                - P) |7 {0 e6 t/ m3 x0 s1 c
}% r+ }2 D0 U5 N7 x5 p
% i" ]0 g; {! X+ K0 |6 u0 t
void read_MSG_buffer(int *baseaddr)
6 e3 D" j9 ^/ W5 _9 {{; @+ {4 X6 w0 B
        pRX_MSG_PROTOCOL pshreRAM = NULL;
; J# D* n0 |$ a. a1 ~- l! S3 n6 l5 v' A
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ F; H5 M& M. J* m/ k2 f) O
7 P4 l! A4 |$ L* |. @        if(pshreRAM->packet_cout != count_copy)
: @* N1 b4 C% C        {. a9 e. c" M3 A
                printf("a is %d\n", pshreRAM->a);
' N# V& f7 Q! G( F                printf("b is %d\n", pshreRAM->b);) ?4 }, f  r& |+ H: |+ x2 x5 p
                printf("count is %d\n", pshreRAM->packet_cout);
3 c. i2 ^& j! U, u1 r5 _                count_copy = pshreRAM->packet_cout;
7 b: I  K* @4 Z7 }5 S        }& y) h5 n" v9 p6 v: P6 m
        else
. T, W* W9 ], [5 f. G% G        {; z* D! r% B  ^/ }; A6 m5 C  _( A/ v
                printf("No effective message!\n");0 H# F' Y( T/ Y) N- {- a1 C5 k
        }: R/ k5 o( I6 n$ B9 t
}
" y( P" U7 W6 F& r. E0 B9 i. m2 P9 c  w, P6 I5 ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% g; P1 R; x4 _+ z/ Y, O. q

8 c) A& H0 y2 V
/ H/ a5 u3 a' [0 o( h, W1 B
; n' s3 U8 B/ g9 D8 V- v' A
  P! O* w4 J' f: O+ i6 S




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