嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 M0 x; O0 b3 m* v$ a

- n, f8 f' ~  ]3 c: e3 Z& mOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' H4 M# n, W9 ^8 v0 G
#include <unistd.h>% E  e) U6 W; L1 @( U# T) _. C- b
#include <sys/mman.h>
0 u- `! h' V: W0 V; K. U3 |#include <sys/types.h>
. s  ?* E; X2 t5 b6 X  D#include <fcntl.h>
' p8 K" D" H! K9 `& ~& M. t
6 h* ?) S7 b7 P8 w" j. M* o#define SHAER_RAM_BASE_ADDR    (0x80000000)   % C( |- B# l8 V, z
( D/ B- G2 z2 ]' I
typedef struct
. W" v/ x! A; l3 s- O{
  \5 f9 @6 @& |6 W' N. [6 G% v        unsigned int a;- B  y' b4 {# Y1 n/ p  o) K5 ^7 I
        unsigned int b;
3 M' P0 q" z  V+ W8 T        unsigned int packet_cout;
6 `! ?: M/ Z6 I7 d5 ^# c5 ~" W3 H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! L( X6 _) D  @0 D4 J9 T1 C/ g$ I4 |  f" Y$ L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 `  ?% A' k0 [6 tunsigned int count_copy = 0;
6 H8 r7 k! B4 _8 y/ [3 i& J- V. [8 ^  U7 j: |4 B6 N& w  V6 L* `

1 s1 ~. a* R+ X# K- m9 A' ?int main()/ U3 j  v# x! R- |5 \
{- ~' X: ]% S+ p  A
        pRX_MSG_PROTOCOL pshreRAM = NULL;3 Y8 A1 m% e: F" h" E
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;" I  f& f3 I( g
: U- ~1 O1 j. A; }
        while(1)8 \) K" t6 }) c$ k" y
        {" B! i5 ]+ ^% u$ C
                read_MSG_buffer(pshreRAM);
: E' t# F9 e7 y, E+ O        }               
" k6 ^7 o9 U3 F1 T" n}3 E; L' ]% ?& t: J

1 Z0 `$ @, t3 O; Svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 W6 k" E6 ]4 I/ U4 r, f
{& C) a# n& F# n
        RX_MSG_PROTOCOL buf;) N! R' @! s( ]
        
: L) W% ~  p8 N5 \0 ]9 l; O, ^        buf.a = pshreRAM->a;: W% Y7 q& S  A* y
        buf.b = pshreRAM->b;
$ t7 a; a( w6 s: P8 s        buf.packet_cout = pshreRAM->packet_cout;
% r! D; S0 o! O7 d" P7 r+ V2 \        ; X; @; q7 i% X" ~) T
        if(buf.packet_cout != count_copy)
) T/ T% y7 `9 @6 _        {: C6 V# }9 A5 r2 d# Q1 W
                printf("a is %d\n", buf.a);3 U; A* t7 G- c/ `
                printf("b is %d\n", buf.b);! g( u( r' Y% y6 w$ ^  {+ k1 j
                printf("count is %d\n", buf.packet_cout);
' G" e3 y& q5 c9 Y. n. L; k                count_copy = buf.packet_cout;7 N9 l0 I. g8 H2 f$ E& j: Q$ g
        }* O+ T/ B* |' X6 k5 |1 `# F
        else
! J7 [: E, J3 S. @7 `. Z2 S        {' J: t% B4 S  Q  ~4 I# i( M
                printf("No effective message!");
/ O. F) \  i6 E$ ?  m% U: a        }9 l* ^" C5 [) K7 ~
}; t: r% h( Y4 p. x2 c) T- p

( W( F3 H; u- |9 Q- p% I4 v; m. w- ^) e8 j1 c" G; ^9 M
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。5 g0 ~( Z! E  n/ S" R
使用下面代码,对内存使用了mmap函数后:6 N. V3 H* z  H
#include <stdio.h>
. O. j4 ?3 Q" V/ {( p#include <unistd.h>( I8 }' f6 _- i% j, V
#include <sys/mman.h>" ?8 i: E- L: j: f% F
#include <sys/types.h>
3 q" U' i/ Y6 C' K0 s$ {7 b' k# A9 I#include <fcntl.h>$ v& W9 y: a2 n* B: E( B+ \; q
  r7 _$ k2 e% K) j4 R# M& y
#define SHAER_RAM_BASE_ADDR    (0x80000000)- l. |: y" w. p8 i
#define SHAER_RAM_SIZE         (0x20000)   ! E! k# h: b) _" e) \3 F9 D" n& ]

+ F8 p; }4 b) f0 s+ H7 qtypedef struct7 i1 G' ]! A$ r
{
  }: U# [, f( }7 o3 g3 A        unsigned int a;
6 G- s, x1 m2 p. N        unsigned int b;
& l, l0 x4 t( U. ~        unsigned int packet_cout;1 L" O) R$ \- J; @' y: k9 ~7 |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 [/ ~0 b& J1 Q! X! |0 i, Y( O

, z! C/ J* ^2 w( x) ]% dvoid read_MSG_buffer(int *baseaddr);. s1 ~$ W7 n0 R9 ~4 ~9 E
unsigned int count_copy = 0;
  j3 N* i  h0 K! }- s+ a( b+ u( k( T& _! P  p9 e) {" K
int main()- D% w- ]/ U& B. h) [8 i
{- S$ y8 J+ j- y  W
        int fd;
. K/ d3 C- \- s$ H& i2 r        int *mem = NULL;/ K8 Q, q& g2 f7 i9 |

# A+ q: }0 l7 i% V7 K) e5 f1 ]( q        if((fd = open("/dev/mem", O_RDWR)) <0)3 ^2 F, _( C$ y
        {
+ h, {2 A" v, d% p; L+ @: @                perror("open error");
% _; n! y+ o3 i3 N                return -1;! H6 I6 C- x) N$ m& Q1 A5 q* [, Z
        }& G: G. R( @* K) F8 v; j* b! o# i: g
        
2 i- ~" o* y/ }; E  |        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% W& Y5 v, V& y

- d! C0 a% b& c3 n/ \3 W- F        while(1): }; M7 X0 [6 S3 F. x$ ^: t- [: F% l
        {# W1 k$ N0 [) |1 K$ z
                read_MSG_buffer(mem);5 F5 Q, }5 X( g) _- U# s4 G
        }                # T! E; L% {" c) }1 t, @
}
& k9 \# E  N0 s+ Q" G! }5 S' I& H2 x( o$ `
void read_MSG_buffer(int *baseaddr)# N: y! ~9 w2 k" P. C1 K! _+ `% Z
{
3 @( q; v& i, Y1 @" u4 A        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 x9 l+ M. K( ]
+ [9 h* o/ ^# Z0 z- B' X" \        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" \6 I3 u6 f7 ~/ W' x1 p6 x4 E- V4 {  m, V3 o
        if(pshreRAM->packet_cout != count_copy)
2 ]7 L  }9 q, j0 i: H- n% g        {
! \9 r: q. ?! o* A$ K- i1 W                printf("a is %d\n", pshreRAM->a);8 \3 R! b. y* I& }; g7 N
                printf("b is %d\n", pshreRAM->b);
3 K4 q$ Y- e' C                printf("count is %d\n", pshreRAM->packet_cout);" `* j4 a) i$ M, j9 N! {9 ]( L
                count_copy = pshreRAM->packet_cout;/ z; x0 }# c) \6 }- v% E* q% k5 S
        }9 j  y# N1 a$ K8 N+ \6 h6 j
        else1 S- L# K! [9 l6 z
        {: E; {0 t- a( D! e
                printf("No effective message!\n");
! ?8 o! f) b. e! N' l7 P        }
3 V8 w( g: a! n9 z}& J. Y, W8 n- z8 v4 p
7 Q( |) K( ?3 S8 j
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 N" u4 i6 H% x8 V; G

, s6 H/ D2 H! z* q- W- o% n# V
5 R- ~/ U: K( B: H, h! `% G; l. d& d$ }% J

# V% M$ w6 T4 h: E! e




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