嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 R( q% n. u: h
# f6 X; C5 P2 q  z. A0 S, v. `OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 {' ~  g# [- t# G+ }  g#include <unistd.h>
2 w  r1 `" t: G& r#include <sys/mman.h>
0 q8 {0 a$ {) d9 L& \4 w, f$ p#include <sys/types.h>1 R- Y0 s% n( _8 L
#include <fcntl.h>
8 D& T3 c1 W2 O3 o4 U" s* [. [0 X( V* z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
+ E* r+ y1 D+ w. r( {4 B5 M& q# m. c3 _, e3 p7 }: m9 w( t) o* f9 a
typedef struct- Y% C, \" d3 O8 j
{, J. e$ Q6 q( y, x
        unsigned int a;* L. d2 t) B: Z& P* P; C; l
        unsigned int b;
9 X/ t4 d, r( v$ i' R1 m2 T2 e        unsigned int packet_cout;
$ m; U6 `0 p: o! U. w$ a. d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- {, Y  s/ j+ l! a! n+ G7 ?
# {# F' D6 A" x8 T8 L1 @7 T& T, A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; l4 W+ g" X+ runsigned int count_copy = 0;% r2 o* \- N! F9 C% \5 [

4 h1 }8 n; p0 Y
5 \8 }0 Q7 ?5 E6 y8 g* G& wint main(). v, g1 C9 }0 ~% E
{" F7 `  w* }! k/ g3 L& U
        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 e3 x" i& k: ^+ x, i' A% K+ S6 Z        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ t9 }0 p6 {1 V

# z) z( p+ H4 L* |/ D* u$ A        while(1)
: I3 |& k" p; S# ]        {5 X! S6 s$ z: _5 \% c
                read_MSG_buffer(pshreRAM);
2 F( _& ^8 }6 a/ j6 I        }               
# T6 l; L8 ?5 k0 G}& A" P, J' ~8 G" e

/ A7 Q9 x7 Y' Z5 x; N7 e# I3 @9 xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 w& d0 h# ~% a2 B) E
{. @' P5 g) l& Z  O1 P7 S
        RX_MSG_PROTOCOL buf;. k; K( m- c7 Z- V5 C( ~7 a6 a) V0 W
        $ ^) r( _9 h/ V$ z  E
        buf.a = pshreRAM->a;
$ ]" N; w! L$ A& z        buf.b = pshreRAM->b;) R8 s1 g7 Q- V; o: N; \0 Z3 \
        buf.packet_cout = pshreRAM->packet_cout;8 Z6 E( Z) O! r, {
        + T: D( d# R- F. q1 {  G
        if(buf.packet_cout != count_copy), {6 j1 v' c3 w" M
        {
! h; r0 f* K. G+ A, C3 _7 e, w                printf("a is %d\n", buf.a);
- P8 k, N5 e! T, ^/ N                printf("b is %d\n", buf.b);
) m- s/ M, [  v0 a% |3 k9 h                printf("count is %d\n", buf.packet_cout);
0 P7 i" w$ h9 p; G. \                count_copy = buf.packet_cout;
( J" W7 s9 g7 [7 l) n3 E+ @        }
$ A6 V6 A: n, `- b        else
  Y7 p# k% ?  d3 S+ Y: P        {% o4 C' N$ Y' n9 _
                printf("No effective message!");7 E: K9 X4 n) u% G7 o" `2 `9 r
        }
" d  Y1 d" \& z( d8 h}
% }) m7 v# K& o6 o8 J# k# ^+ C  n9 q/ p5 y$ c- P

7 @& [% t, `0 m但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ J. d. G! ~8 [, S; E) C0 y; Y
使用下面代码,对内存使用了mmap函数后:, S; m2 a( U3 ?2 D
#include <stdio.h>
$ S, o8 W! l9 `- V#include <unistd.h>
# l7 s: |1 m  K" x! y' U1 d#include <sys/mman.h>/ r. G; @( C1 H: ]& [
#include <sys/types.h>+ ]. I# E( `2 g) _  O0 D
#include <fcntl.h>
" v1 R3 L: ?! o" l" n
  |; t% B  b6 x#define SHAER_RAM_BASE_ADDR    (0x80000000)! p" _8 |6 g, R6 e
#define SHAER_RAM_SIZE         (0x20000)   / C" N* m- U# h- T

. D; u  U) C9 _' e5 }5 F2 Ttypedef struct
+ P* t. |  X$ s# @% N0 H{. w* e- a3 [# l1 m& K: [; B
        unsigned int a;
1 E% Q. C  x6 t% ^4 r        unsigned int b;
2 _8 r% @1 m+ X- m) i/ s- ]        unsigned int packet_cout;
+ ^$ V/ e& V/ W, X: z1 o" J}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 e# x: ~  T' X. S3 J$ q5 L9 M' M( o7 ?* f4 z: x3 Y. \' w
void read_MSG_buffer(int *baseaddr);
6 z: r# @9 Y6 K9 ~3 c# {unsigned int count_copy = 0;% U$ q7 d  A: z! O8 }
( v* W% f, R& @
int main()
" k; P' B! {  G! a7 L9 ?{
% M+ z; @, J! e7 _9 }! @        int fd;
3 M) t& m0 B3 S: ^% c* W        int *mem = NULL;6 r; q2 R& C( @; P

: `! n! j& z: H+ w        if((fd = open("/dev/mem", O_RDWR)) <0)
  O5 D! N+ `, x' X% E        {
6 K( j* O+ L8 i$ E4 x0 s' w                perror("open error");0 p4 ^5 Y4 Z2 N4 j, }0 N
                return -1;3 c& B7 s5 e1 M, G4 @% U$ n0 ^7 Y
        }
. C) t1 b9 N- O; x3 L1 F( e& q        4 i  `! |8 d$ s) C4 F. P9 L  O, `
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 r0 a( F) ]- y! a5 r# {
2 i, p$ @  _3 h4 N
        while(1)
, p: y0 M4 ~; m3 u6 r$ }        {
' c5 ~; |4 n5 q; j' b/ b* L0 g" z                read_MSG_buffer(mem);
5 z# l  h, u* [  R+ Q        }                " r5 g( F; x& _# F
}
2 h, S7 K* Q4 v% i0 ~2 \* C8 B- g) ~* S9 M; T& |
void read_MSG_buffer(int *baseaddr)
6 h6 V+ y1 Y& m. I8 e" Q( b{: ], m& w% ?$ Z9 F8 `
        pRX_MSG_PROTOCOL pshreRAM = NULL;
% b' v9 G; y1 W( h+ I/ N5 l; g; p8 [  z: C) @$ ~- \
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- z. z7 V4 U! f: I3 o! ]" x

/ ?1 E7 l5 h; p" f+ o        if(pshreRAM->packet_cout != count_copy)) J6 H% V7 h; [4 l3 ?; a
        {) p0 N3 s; m0 p, m
                printf("a is %d\n", pshreRAM->a);
* A* i; J+ {/ a                printf("b is %d\n", pshreRAM->b);- c+ h% j8 A: t8 K6 o: y6 ]4 `
                printf("count is %d\n", pshreRAM->packet_cout);
: f. `1 d) Z. B# h, h                count_copy = pshreRAM->packet_cout;0 o$ \3 A5 }% N1 b$ j) y
        }
# K+ p, P1 n1 O; [0 i9 @6 E        else* `! s- n6 F/ V% g5 P
        {
* N6 h( E: b; n9 m+ g8 e                printf("No effective message!\n");
! k2 r7 Z. H4 M: J. \: a        }
1 O# u! }. L- {  L; S; |}& O$ l/ h4 f7 }
3 F, m7 O& K8 z& j7 w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ z# a/ L8 v/ c6 o
5 S9 v4 F' p( l% ~+ X
5 h# I, g8 j5 f8 ]' b1 D! p

: v8 b. c* r( M+ j
/ B- Y( k" _$ R9 N




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