嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% s. l0 n" t6 {+ y# T" R0 L* V* b; n7 I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( _2 W1 M+ u- ~) a9 i" @1 C/ R
#include <unistd.h>
4 a+ V$ Z5 s! q$ U#include <sys/mman.h>
4 U3 J0 o. M4 n. c#include <sys/types.h>8 q, p+ i& |. b/ V
#include <fcntl.h>
& C8 z2 k" S4 ]' P% r! K7 }1 q3 I# z, `
#define SHAER_RAM_BASE_ADDR    (0x80000000)   5 W; c8 d; U/ F9 n8 U

* S- B# \: t; r% @7 j& ~typedef struct
% k/ x; t% n( t* X: C{6 K7 e: Y$ l& J( \1 Y/ |  `
        unsigned int a;
5 F5 p2 F$ _4 M' _# N# d4 q- K        unsigned int b;2 }2 S1 k, O( y# h( Z2 K6 A# Q
        unsigned int packet_cout;
! A5 Q+ \0 ?) c* k: ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 E. K) t6 L3 `- f, i5 T5 m; ~8 v8 w/ E" F$ r) d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# G0 y; a& M% P
unsigned int count_copy = 0;
: n) o6 x. e$ P1 a( l- n9 F. M, L' M) W1 n6 E. y$ b
3 n: M7 `0 U( S0 P
int main()- T' e2 E( w* t/ y
{$ _  W/ K& w- H/ J- R
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 I) y: _& s7 n- u
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ C% k& b# h9 U% i: G8 c
: Y. \7 d' ^, o  H: ?/ N
        while(1)! y5 b5 ?9 \& U" }
        {
% M& H# x- n* x2 u# L                read_MSG_buffer(pshreRAM);" Z( r+ ^1 G  [9 \6 A" {# R' V
        }                ; u9 i  ~( E3 A
}) p# }8 P. U8 I( u/ O0 z$ d# Q5 u
! e( L* y) v5 q- v- R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' p1 M( |1 h  m  k$ }7 `
{2 {( W( d3 O( e' K9 X
        RX_MSG_PROTOCOL buf;, E$ j8 e& L, ^0 D
        
" R$ h% b. K8 m        buf.a = pshreRAM->a;; U( C: Z2 g$ l, O& z
        buf.b = pshreRAM->b;
, [9 Q' a; i, p* K4 C2 t        buf.packet_cout = pshreRAM->packet_cout;6 J; a& m8 \3 w) u9 a5 |
        
* Y& K* O8 ~2 |2 ?5 Z1 J        if(buf.packet_cout != count_copy)' h6 r3 ?! X  o1 P* i
        {
# z) S# W' k. \. j. E8 E                printf("a is %d\n", buf.a);& N) j" o) Z; r
                printf("b is %d\n", buf.b);
3 V* u- {' |4 D9 I; A                printf("count is %d\n", buf.packet_cout);
  s5 l# `: L# V4 X5 T3 w* U                count_copy = buf.packet_cout;3 Y% B$ J9 `# W% ?
        }' C' N: ?' u& M1 V% b% j/ z0 \
        else: @2 m# i9 `8 D9 `- j# P
        {' D6 ~! C! r3 b7 y
                printf("No effective message!");1 h: \& E8 K$ `0 V
        }% p; |, X+ [1 r, o: x$ A) j
}
1 P7 O9 i9 p0 ]) o; w% C$ w5 W( k$ ]8 G

& w" p) z2 b  j: a4 Y8 w6 r' x但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ a5 U! N% d$ \使用下面代码,对内存使用了mmap函数后:
8 D! |& t1 v+ w- O#include <stdio.h>
( r/ w# ~4 T/ S#include <unistd.h>8 Q0 ^# {. _) v) Z4 @! ?
#include <sys/mman.h>- L2 Z) ~9 s  v) Y1 G3 _
#include <sys/types.h>& E) v5 j* W  q4 V  v! z8 o+ k
#include <fcntl.h>% Y9 M$ Q+ v1 _! }: p0 m$ h0 x

" Q# F2 T0 s* `* y+ \/ K#define SHAER_RAM_BASE_ADDR    (0x80000000)3 Q' h  X$ G4 d. F
#define SHAER_RAM_SIZE         (0x20000)   " [2 W: Z2 C* e- n) m' H

* g. v( h) W: h* j! D7 s: ntypedef struct
1 D% j0 s5 ?, Y4 n7 [9 |{
$ ?4 ^/ {' K& V; d5 m        unsigned int a;1 \0 U/ ?$ Z% \" [1 G0 o
        unsigned int b;
+ {5 }. w4 k, J$ ^2 X( ~6 Y        unsigned int packet_cout;% {: q/ S$ `" @4 s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 Q1 H$ d- U2 z" c
* v, O1 E/ C% e6 Lvoid read_MSG_buffer(int *baseaddr);- l" v7 R+ W+ R
unsigned int count_copy = 0;
9 R6 f1 W3 l* T; M
) @% W8 N4 G# ?2 r& E& b8 a* wint main()& a& R0 j# B; N. W
{8 h6 G2 `+ u3 m) J7 i" D. m
        int fd;
5 V, w# L" X  x; Z        int *mem = NULL;
/ @( R. ~8 w2 v% p; {- N9 b! Y0 {( i/ j
        if((fd = open("/dev/mem", O_RDWR)) <0)' y7 e1 q' g7 L& x  |9 _, y
        {+ M: D$ U& a% G/ p
                perror("open error");
& r* o, V0 |! k                return -1;
) R8 L/ j) D& i4 t2 P        }* x; V3 V& T7 G
        
& s$ \; F% ?8 m, d6 h& M        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ y8 c+ w. x, v' C2 C, i

, d4 X0 t2 ^. q5 F8 |        while(1)' D9 H4 [  S% S
        {
( W/ y8 x1 {- _' }; S4 t# w                read_MSG_buffer(mem);( |; \1 t0 b: T5 X
        }               
& y# Q* ~" ~3 ?6 g- F# e4 x}: ~/ h, y1 ~6 T' u0 e8 M& u
( c) N7 T4 T- b& t8 u2 m
void read_MSG_buffer(int *baseaddr)
: T5 c  J% j: q9 ]( I: Q( w8 N{6 D# P1 {* J2 p& \8 E( }6 _; c
        pRX_MSG_PROTOCOL pshreRAM = NULL;$ V& f& ]* Y) G2 \
- @5 Y4 H% }2 ~5 L( Z$ T: m
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ ^8 t2 O. j2 [2 `6 r6 v' w, K
( c! @4 _8 Z+ u$ a        if(pshreRAM->packet_cout != count_copy)
4 U5 M* v# ?7 D0 P4 K  Z. [0 `        {( ?8 N/ e1 o1 X- h0 e2 ~( \/ e1 Q
                printf("a is %d\n", pshreRAM->a);
% g% [" H0 B. y$ |                printf("b is %d\n", pshreRAM->b);
1 W' c( `: [( x7 O, L                printf("count is %d\n", pshreRAM->packet_cout);
3 C' u6 \( k4 m4 e$ `                count_copy = pshreRAM->packet_cout;) W9 a5 S9 h( w# W$ J
        }
. N. v, h3 \. j+ }        else! S4 U, s: l& P- |2 Y" {, {
        {/ D: N% a# D; ?
                printf("No effective message!\n");
! \! a' w! ]& u1 F0 b" G) p        }
6 p) s0 _2 r* U" c}
& {; E, s' w, B$ h/ O; \. @% O% y) ~
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; t  z6 p% k) [. V- l( ~
; [# m' S8 K/ p8 I, c* z* P1 m2 R, A

% j1 q) b, h! z4 z5 s3 _! d* j) U) `( m" g) H

7 P+ \8 Z- z. M6 [




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