嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& `$ S8 v' ]! e3 l! r. a9 H9 j7 o" _/ M8 U
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" I, ^. F6 I/ M4 f#include <unistd.h>+ F6 l1 \4 X) \8 g$ G* W7 U0 H
#include <sys/mman.h>
% \) u% m' P( J, M; T#include <sys/types.h>6 |! ~& {  {) R: {6 i
#include <fcntl.h>
6 L8 ~2 Q; j7 m- K0 M+ K' r0 s! B9 A* V7 r/ Y; r
#define SHAER_RAM_BASE_ADDR    (0x80000000)   * H% c" T# y" U

- x+ s) ?- t' D6 ztypedef struct
* S/ d% P$ ]6 w{
0 @- O/ q8 R7 i6 k        unsigned int a;
/ B- r3 u7 }4 \1 C3 ?        unsigned int b;7 U- H7 ^+ o; J- g  J
        unsigned int packet_cout;+ e4 R9 c5 y/ p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; ~$ ]/ M; J- [

  }8 S7 E0 B6 E  R' Pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
  J) x' Q( _  I, ?unsigned int count_copy = 0;
5 j  @) B( y) V+ w! Y# U0 v) _: z" ]: V$ S& r
; {. a7 X; B" t& N6 \4 Z
int main()
9 g5 m: |5 @. q: _$ q1 \5 N{9 K4 y6 a; E$ @1 w% @
        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ P1 Q0 s* }% n- B$ b4 P4 h        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; h, W! Q, D' I( \+ B
* f) z- h7 b/ P* h' G
        while(1)
; ?, M1 |6 }9 S        {
& V& L& j& T) m7 \                read_MSG_buffer(pshreRAM);& x, H: E6 M# p) L" h+ R* c
        }               
0 b* I5 J9 Y% J}: t. ]( L% N* O

( P- i* E3 k+ I3 o0 k/ Fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 G  t* a9 x; W& a
{
  g3 _4 x/ U! L% K* v/ j% ]        RX_MSG_PROTOCOL buf;
, O/ ?% I2 H- q5 n/ p$ s/ D        
3 i2 b* B! o; t: g        buf.a = pshreRAM->a;
0 i( W. s6 g0 x# {        buf.b = pshreRAM->b;% ?" A) T) D( `" }2 m
        buf.packet_cout = pshreRAM->packet_cout;
, D9 s$ P3 r7 H# C" B0 C        8 A4 x: A8 a* e( R  R
        if(buf.packet_cout != count_copy)
- _' M9 e3 q8 t  ~        {0 _! p0 H* U* e* c' @$ y
                printf("a is %d\n", buf.a);
& |: J) L4 f$ J/ A( I* P                printf("b is %d\n", buf.b);' i4 l% O) `+ n1 H8 N: z
                printf("count is %d\n", buf.packet_cout);
, F2 ?% {) c8 R' a! G" y                count_copy = buf.packet_cout;2 ]) Y8 }% w: h+ e4 v8 c6 E6 c
        }7 H$ J$ ?! V% J$ i( G% q
        else
3 b$ y1 W; I) k" j5 U5 n( T; O        {- h& ?6 U( W9 ?% W% Z: ^
                printf("No effective message!");
# ]3 F: t. U/ q" c4 g) E! l        }4 H( G; Q% f; p; P0 ~2 ?3 n
}' Y! ^0 [: v" f" v; `( D5 t8 P

0 g' J4 d. ]( _# x3 c; M6 n7 S0 y9 _3 b: ?0 T/ Q/ h4 ]/ g
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' m3 y4 O9 I- A+ c2 b- l
使用下面代码,对内存使用了mmap函数后:
, [2 \% r7 v' M2 X" e, l( b#include <stdio.h>
" t% \( v6 h/ i$ [2 Y. y#include <unistd.h>
: ]% G. I3 \' J' Y& a1 h9 _#include <sys/mman.h>
$ n5 s, ?# ?4 u3 r' A1 p#include <sys/types.h>( r0 l) A- b' U: P) n: R
#include <fcntl.h>* U+ j$ g/ P3 O) J
5 g% K0 g' d$ Y! `6 k! l) L& a6 U
#define SHAER_RAM_BASE_ADDR    (0x80000000)
3 d2 L4 @& ?' |9 v8 `#define SHAER_RAM_SIZE         (0x20000)   # e/ u% n. i, o1 G8 F' K

( W1 k3 G* t$ h& b" P. A7 v0 \typedef struct/ V: l* t5 f; [2 b9 V
{; N: R" u# r( p2 a8 X" H
        unsigned int a;
. J# k, R% X% l        unsigned int b;4 {9 O: w2 [3 i0 c2 Z! q0 O3 {. M3 _7 A
        unsigned int packet_cout;$ H- K5 ~# M+ S* s( b1 o) t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  y6 ], {* N0 l( H' D
* e+ o! @3 D( {# |  t8 b/ G* L* n2 Ivoid read_MSG_buffer(int *baseaddr);; U) O$ b" Q# s  _
unsigned int count_copy = 0;
. I3 c+ _* N7 ?0 }6 C- K; l. S) e' u7 d: w4 T8 r7 B7 _- w, ~
int main()% H0 Y$ u& x/ E. T) U
{
+ E$ g; _; `. h8 g        int fd;7 ]4 Q. Q( M8 @" p
        int *mem = NULL;/ Y7 ^; R$ [! A, e
* v0 f" j& Q0 P
        if((fd = open("/dev/mem", O_RDWR)) <0)
- W. m+ y5 w, O, g2 `, f        {5 V  G5 [9 d, u/ m; C
                perror("open error");, _0 E; q, H4 C5 t9 K4 b6 ~
                return -1;
' F% ]6 D( z5 i0 I! ?  q3 C        }
: ?; @( W; a: P5 i; X9 f/ E3 ^* H        5 u, Z( M: O' J4 @  V* n; E
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, I# m) e# Q: F0 c0 z
- r- m5 N2 X1 ?( b0 s4 V
        while(1)  `" C  Q4 d, p+ X5 z' c+ N; ?/ F+ J
        {
, {& U4 f6 W( N! \- p% s                read_MSG_buffer(mem);
( D. Y1 o0 _' x1 r        }                ; X2 i9 P) q! B; J
}
9 e- U1 R9 L2 }6 B' F* V  }% O, \- _6 }
void read_MSG_buffer(int *baseaddr)" J* e" S9 F* U; p0 l3 M2 g
{
; O. E" l& D/ c7 x! I8 e: q' Y        pRX_MSG_PROTOCOL pshreRAM = NULL;( C/ a! A& F! A  }" F
6 P8 ~+ o1 |$ d9 v5 K  Y
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;3 e. b- ]) H4 J( W# Q8 b
2 l0 U' n2 Y: E% ~9 a# w
        if(pshreRAM->packet_cout != count_copy)
+ z  f/ I! _5 U( G8 i) M2 B        {- j6 ^* n+ V& p; F+ s" D" p3 @
                printf("a is %d\n", pshreRAM->a);
- R4 e8 h, C& f0 I                printf("b is %d\n", pshreRAM->b);8 g- h3 L6 g+ `6 d7 l5 G
                printf("count is %d\n", pshreRAM->packet_cout);
" @: F0 U( P) x6 _                count_copy = pshreRAM->packet_cout;
9 t( t1 J* \+ j' e: X        }3 ]! k8 L5 [) E9 H/ w8 i9 Y
        else
8 ?8 o" Q( L3 L' s9 a9 @7 E        {9 v- s3 y( N, Z2 J
                printf("No effective message!\n");/ ^- J0 I# |& s3 q
        }
7 t) _4 c: x; `: B0 E# m}/ z" _9 Z; |( z+ h* k
& r3 J& L" Q# {1 f/ p1 K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 \; f# U) F1 t: V% d6 r( S

6 q* H' @9 w+ P2 x, I2 Y- e/ s5 ^( t

% f! k/ c5 E/ D9 j7 C9 ?6 K; X: ]' n3 a4 w1 S; N





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