嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 N& }/ i4 Z* ^8 _& t4 g9 Q7 l/ A3 t
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) N" E+ ]- S0 U. b' R4 e#include <unistd.h>! G9 z5 g; Q) g
#include <sys/mman.h>
. W& ?1 x: N& u2 _5 o/ f& ^#include <sys/types.h>
, ^. [) \1 v- t, C#include <fcntl.h>
- Y# w" J, P; d6 `1 d" r( u; }" C# m
7 v" ~, T, \; H8 N6 J#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) G# A# s% @- L) j" K

. I0 Y9 I+ ^( h& n7 F. h7 O& Rtypedef struct! S7 R+ o2 ?  c1 S2 a( K
{1 k7 W5 L0 i  k) h
        unsigned int a;
5 u0 Y. S) [9 t" ]        unsigned int b;
( j2 q7 q" v- Y8 A        unsigned int packet_cout;( ?  {8 l$ `- c1 i" J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) h  n* T9 z" ]; y  ~2 P5 s' n: A$ n
& y8 P3 y' x+ Z8 o# a$ Pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; X3 N5 T$ l& d& a, \& x
unsigned int count_copy = 0;+ c( d' u  m* J- S0 ^& z' L

& Q, w1 R6 x3 A  {- v5 {
3 C0 H; _2 ]# ~1 ^- Pint main()
% T6 T8 K. ?5 l( N2 w/ c{4 S; V  x1 U  P( p' l& }
        pRX_MSG_PROTOCOL pshreRAM = NULL;* d# g# \* j! ~& t; E0 K, N1 k
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 Y" D" x9 i' E- X* {  W/ K7 `3 x) _" f* P6 P1 l$ \) R0 V) W
        while(1)2 P$ @. A/ J! ^+ q7 B6 ]( K: P
        {: T4 D8 Z  E* o+ D: p
                read_MSG_buffer(pshreRAM);/ c  ^* `/ ~0 l2 Z% H4 \8 o
        }               
8 v5 L1 ]/ O0 Z6 R% m' \}8 h0 d  q- K: z0 |6 k1 D7 E1 b+ J; @

0 n# Z: Y( N! Jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' e& w# }1 @2 X% I; O+ Z  f: F
{, U9 w, z4 A  {* s5 U4 I/ Q0 n' m
        RX_MSG_PROTOCOL buf;
- `9 K. a! l7 R4 L& m        
6 l8 O, A! o# g; j$ x( C  ?        buf.a = pshreRAM->a;2 Y" G- P6 [$ g
        buf.b = pshreRAM->b;  F6 C$ N; e2 A0 h* T/ ]
        buf.packet_cout = pshreRAM->packet_cout;
3 K; i- s% P5 `: G. z0 a& _: W        
/ u! o, C" W; V3 c, h* a        if(buf.packet_cout != count_copy)! w8 C) b% \; z0 R/ ]! D! b* C! C' ?" V
        {) K3 M5 B) r& {
                printf("a is %d\n", buf.a);& y8 `5 P( l# X( d! N8 v
                printf("b is %d\n", buf.b);2 c0 b* o- x& a$ d: B
                printf("count is %d\n", buf.packet_cout);" Y' R3 p/ I( p
                count_copy = buf.packet_cout;1 C: H- ?3 m$ ]) G: x
        }! K* Y8 {! ^! Z9 q
        else3 o! w' W; L; l. l7 T
        {+ g: ]' ~6 u* Y# L1 l: c. X
                printf("No effective message!");
: x- Z& p# m% d/ w. r        }
, W& [. `9 [. ?, _# n" q4 \}
, v; Q# X( n2 Z' j
4 W& w5 ~$ ]( l! c
7 e8 Y$ w# t' M; ]0 b' O; g但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。  n( D. W- P% E* H
使用下面代码,对内存使用了mmap函数后:7 y$ X$ V* @4 v: T" j
#include <stdio.h>
+ e( `4 y& P; p#include <unistd.h>
$ B: R3 ~" d  S; C( U4 k% N#include <sys/mman.h>
$ Z6 O: x* d6 [2 Q$ C. a" H#include <sys/types.h>9 w' H3 B' n( r  I% O
#include <fcntl.h>, {3 _& o; N  i1 _
+ p! }5 e. ~' }( B' J' r" r/ h
#define SHAER_RAM_BASE_ADDR    (0x80000000)2 f; d' ?  U8 g" O
#define SHAER_RAM_SIZE         (0x20000)   ) H8 c# K& e! s; |: {9 {/ V% A
4 u& _! T" y. {2 `  }% t+ i
typedef struct) P" |5 `0 P% N% \2 T% U
{0 p6 e( T; u. C3 }
        unsigned int a;0 x; r7 _, G" D: L6 e
        unsigned int b;
4 u' T5 ?: _+ e* O        unsigned int packet_cout;; g  ~; o; b5 [* ^; n  y' F& v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. f3 l9 ?3 {! D, g2 R& Q# D! K/ L
void read_MSG_buffer(int *baseaddr);& Z' r1 o6 m- d' I9 W
unsigned int count_copy = 0;$ }- Y/ _. c/ a0 M3 @* R& _/ |' D
# _; w& N. v! B
int main()
* X- M0 Q8 u  t3 {{
# ]5 T% `1 E" w- X; ^        int fd;$ k. h# w/ Z  x4 L0 y
        int *mem = NULL;& B% `6 C7 E& x

  c4 x4 x. w- b; |/ `7 {$ w( Z        if((fd = open("/dev/mem", O_RDWR)) <0): Z0 T& f5 g1 J$ Z1 A9 \+ E7 j
        {
( U! u. O( K2 ]9 n7 J                perror("open error");
( h1 j8 k) O1 `$ `% \0 o. p                return -1;
8 f9 K) a+ ~: p4 V        }1 M: q; T. }( t. n0 M' \  V
        - Z5 I# `- X' t  \5 @: _$ R- u
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, b. @7 ]$ o( i- C, f$ k
' D+ t, m- {: q- c0 O+ U
        while(1)3 k/ E4 e8 ~' C) T
        {
" s( y0 Q. u& Z  X                read_MSG_buffer(mem);# j- `7 L5 r, q# e0 g1 w; A3 B
        }               
9 e" _' c/ x, M* \}
6 u9 H/ N! Y0 w& b0 b
8 n4 `1 u3 o# d+ Dvoid read_MSG_buffer(int *baseaddr)
* j) a# v+ j3 H: U' Q{
5 d: M& _5 a3 d        pRX_MSG_PROTOCOL pshreRAM = NULL;7 Y8 z; t! w3 A/ f2 ^% F4 W! }% J
# v6 \% j; A  C+ V( e$ A
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 @3 K9 \4 C8 r! w
! @# N. s- ~( y0 y; U3 H        if(pshreRAM->packet_cout != count_copy)! Z: P7 v8 D& c, d3 ^8 Z5 j
        {
. [/ e2 E+ v: @% {* @                printf("a is %d\n", pshreRAM->a);
5 x- J+ u6 r, n) f0 s                printf("b is %d\n", pshreRAM->b);) {- \$ [! I# e0 d
                printf("count is %d\n", pshreRAM->packet_cout);+ z6 |4 R4 k; u
                count_copy = pshreRAM->packet_cout;
1 d5 {8 Q& A4 ?& ?# f# D: I4 S        }
- ~" V. @/ H/ B4 e        else
0 y; v0 J" J1 _. \* R8 h) G3 }        {! r% U/ f. A3 a/ D+ i9 t
                printf("No effective message!\n");
9 }/ V( K4 v4 n0 K        }
/ q/ b4 k8 X+ P}
' M! u' N& Z+ h) W& x3 G) T# Q8 M3 O( ]) T+ u, ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ V( z2 t3 m7 s
, p. M6 M7 i! X9 Y, [9 p0 t* ^, k- I/ G! v. L5 N/ ]

; P8 q/ z- t6 |8 B( R/ d% V: q$ |/ w8 Q: d/ S) E+ O0 r





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