嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 ^* C2 s) D  q7 y  @. P

/ m- ?1 Q  V7 R* p$ u* u& G/ iOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 R( z2 b* W+ Z# Z/ |5 l, e6 W
#include <unistd.h>4 l0 H  f0 Y% y( S
#include <sys/mman.h>9 i. ^: G( o* B/ {: {
#include <sys/types.h>) F8 l& V% u* l+ m# `) K+ I* j' D' h
#include <fcntl.h>
/ V& w- l6 ?/ d" G9 ?' x+ j$ L/ z" Q+ C+ B8 V  Z/ B, z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ' I) T$ p% N5 @. W
  e& h. s( h2 d: {) c' @7 f
typedef struct
1 G1 [, K' u/ P6 h; [% a2 s" |{
: @2 H5 G# P: L9 L0 O        unsigned int a;. U1 h0 W3 G; B8 v0 l) z, h
        unsigned int b;
1 S  {0 X% f) t+ p0 z2 {        unsigned int packet_cout;, V& m. s$ V! \  o" e# O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 f* \4 Q) I- l. S$ N1 [5 z* P# D$ K6 f* ?" O$ ?$ e* Y$ s) Y, I: r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# L' X. \1 k! J* vunsigned int count_copy = 0;; y+ @, _+ }2 T
+ S# `2 t" f) r2 G5 K- v
$ h( u* B; i0 Z* M
int main()8 H: m6 D8 S- j/ Y( Y& W2 ^
{6 _. o& F% ]( C, D) R. D
        pRX_MSG_PROTOCOL pshreRAM = NULL;
" L' e- Q" _) m! r! O9 N        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ _2 p& K. {  Q# ]" u
, [# i4 ~5 x, n$ H
        while(1)
7 o6 ]' e* g3 |2 K        {
' D0 F( X, B8 d) z5 Z' b: y6 T( U7 q                read_MSG_buffer(pshreRAM);
' ^2 y! E9 d8 a9 W1 n- s. d        }                , s$ }  V" V. i) i
}
2 j5 W2 F' b4 J! L  U6 O5 a  N& |" [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( w- f' `; G9 H! w% e( v: j
{
; G, J8 K9 d/ M$ N; L  g7 l        RX_MSG_PROTOCOL buf;
/ R2 M' L! _8 M3 _+ l4 x5 {7 v2 ~7 ~        
5 S7 q; l; `/ ?6 J. @        buf.a = pshreRAM->a;
% e2 O! M- V+ F3 R        buf.b = pshreRAM->b;
" @1 _5 p$ s- z6 w# ~/ `& w        buf.packet_cout = pshreRAM->packet_cout;" `+ J. d! j. W& c3 N
        
( }/ {6 x8 e7 u' f        if(buf.packet_cout != count_copy)& w7 j# ?! g. _6 i+ U5 H
        {. T0 y7 c" P0 N! Q
                printf("a is %d\n", buf.a);
5 u5 G5 }# C/ f; a2 h                printf("b is %d\n", buf.b);
2 K- ?+ B# j* t. ^' p                printf("count is %d\n", buf.packet_cout);
7 I6 |' }) h$ }% @+ X                count_copy = buf.packet_cout;
$ w( U5 ]3 c$ q0 \3 D2 a        }! s. X6 O; p7 _- j' j
        else+ g9 V9 ?. ~& P9 o9 j
        {+ O: N+ ~: i* d' f0 g6 L
                printf("No effective message!");
7 a/ r; p  S; u! w' c; I        }' f7 D. A) m# A
}( ?8 p1 \6 J; g4 `0 c$ i* Q: T* M
7 _# A& i2 L. S/ e
0 F6 \* }' o* V2 Z; |
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。7 i+ ], n6 P4 K  O, p/ n* k
使用下面代码,对内存使用了mmap函数后:' Z! X8 |1 l( E2 F: l
#include <stdio.h>$ ^- s: B  b. t5 z' {; O( e
#include <unistd.h>" a/ O0 g/ ~! v9 L9 L) b* l
#include <sys/mman.h>
4 \, S# Y6 m6 Q# b1 r6 _5 R#include <sys/types.h>: }* O3 a9 Z! h* Q, S* ~
#include <fcntl.h>
% g) Y) ?: _# r2 F: x( A0 j
: Y$ r6 ~. f8 @8 D. A3 h#define SHAER_RAM_BASE_ADDR    (0x80000000)
4 {& ~" }8 [# ?1 `' [& e#define SHAER_RAM_SIZE         (0x20000)   
9 W* t, y) P! q: w, L% Q8 T
$ F2 _# w/ E5 K1 H) L) ?9 P6 rtypedef struct
6 o0 }3 y9 E/ W! L0 P{0 c' D, p7 Z& |" W5 _
        unsigned int a;- O, R' V/ S$ a& @& e
        unsigned int b;# d1 p: Y0 ~+ a7 _7 w" @  ?
        unsigned int packet_cout;* ]1 I4 d6 p, k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: k9 v) V# F+ I0 V7 ]- b& m- E, X' ]! o* Y+ o; q8 T0 s
void read_MSG_buffer(int *baseaddr);9 R: r% a' N/ n0 \% ~7 g; S
unsigned int count_copy = 0;
6 ~: z7 F! _( }+ e
( S. f! `& X" Y' c4 kint main()( Q; o; @0 C* ]* G! g* K
{
- i6 b2 U+ y* H1 c        int fd;
# m' }! D; N% c  _- l) f; {        int *mem = NULL;8 P* c0 P/ d) z3 @5 {9 T6 j$ k

. u6 r5 i1 w0 _        if((fd = open("/dev/mem", O_RDWR)) <0)
$ X" t1 b$ `8 C5 X$ h7 x8 |        {
& Y7 O; v" u2 U0 \8 X9 o  r( z0 s/ r                perror("open error");
& }8 @) _5 V6 W, u                return -1;
* ^$ M9 O$ S; C1 }1 l        }
: ]* [5 P7 A# e$ g2 l        
1 d" W  \  h) B4 x0 M/ l9 I        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' \0 N/ O0 X6 K
2 |0 e8 U8 o) ]$ C( d+ ^* u        while(1), g4 r6 ^4 p8 ]9 g
        {
1 W# c" J' g- n' a% e8 F3 V8 q6 g                read_MSG_buffer(mem);) X. ]7 {+ a5 W+ ~
        }                * m1 E4 b9 w4 }
}
- e( Q4 Y0 |) L$ D& @& H
! \9 t$ G/ }/ W- Dvoid read_MSG_buffer(int *baseaddr)
: v8 f9 z2 N# o; F* [6 D{
- E0 U7 n& D+ z% e7 N( F        pRX_MSG_PROTOCOL pshreRAM = NULL;  p' b* J! a! a. l! y; w% w2 _
5 B% @% }' P" {2 ?' J, [' G2 M
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" ?( J  d: r% }
2 d0 P6 S" Q: G/ R; o  x
        if(pshreRAM->packet_cout != count_copy)0 n( t8 k! P/ E9 s  @" [
        {
8 R+ Q2 L" I% e  X- i) J; e                printf("a is %d\n", pshreRAM->a);
2 e6 R% C6 D. J& e. A/ y* h# L                printf("b is %d\n", pshreRAM->b);
: t/ D! n0 ]5 b- Z& \+ c1 _7 N                printf("count is %d\n", pshreRAM->packet_cout);! q( E: Q3 \: w) y  `3 x) `
                count_copy = pshreRAM->packet_cout;
, L' h6 \) F& L8 j  j- ]        }
# |4 e( Q, W2 |) u        else
, Q( K+ d& M5 ]! U5 k        {9 i) Y) F2 `- H7 y
                printf("No effective message!\n");3 Q- J" r2 \, `( |* a0 e& \# X0 C
        }
' O- X* w3 q, y+ e}* Y+ G$ h7 F  ?5 O. G. x% I  W* z
9 |0 }" P2 E9 K' D$ l5 \! R
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ K+ G3 u, [, q! K- o

: O6 C( w  y1 q/ ~& i& W) J
* U" e( G- Z* I% X) c: i
$ g  l, ]" a$ P; ?( {1 _
  O- g! l1 t" P3 n




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