嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: s( V" w! p. k3 X) c3 X0 `
7 O! M: D! [. z" q* w! e" g# _OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, k% O7 Y' E9 K3 e3 A. ]( q9 a4 q
#include <unistd.h>
4 W7 G6 w( m  G) |% Z% e( n. S4 M( R#include <sys/mman.h>
$ v! J* ~7 e! W7 O! ]#include <sys/types.h># g7 j2 Q& a0 j( p: k5 B/ L4 Y
#include <fcntl.h>
# x& n! d) z& [% \' b
: Z8 n; w7 }! T! M#define SHAER_RAM_BASE_ADDR    (0x80000000)   
: N" l9 c1 S% M) {; E  l8 ?" ~8 A& N/ v7 ^
typedef struct$ \$ z& }1 r% W
{7 T2 b! [0 _3 {- a
        unsigned int a;7 n# `5 z: I0 @' z3 T
        unsigned int b;- I( x2 y0 s7 j- z8 z
        unsigned int packet_cout;
* D6 e; l/ J1 l0 X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 m" @* ^& U  }* a/ l( P9 p
% n+ _/ X2 p* o! C' s. s1 h6 B! o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. U: e+ H2 c  o
unsigned int count_copy = 0;- |; C! a2 {( t) J

9 v8 y# Z! O4 Z0 d! {: i3 L8 ?6 J6 Q! s4 k
int main()
1 \9 `; L" @6 y* i9 C- d1 Z{/ G) Z  P6 d' W: F. o
        pRX_MSG_PROTOCOL pshreRAM = NULL;
" |6 o% H& r+ D        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& [/ u) t3 r8 W) M; X! i
0 q2 E) U) R/ j" V        while(1)
/ |6 C- n) G; e; ]- g% c. v% F        {7 O2 F4 [1 V+ D  K: ]& }+ o5 G
                read_MSG_buffer(pshreRAM);
! x, i& `" T/ n0 Q' k        }                + s/ m' {' f6 D8 U
}
! {% J% c) Z  Z( K( X% O- C: x# |$ P; c! |* K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 W0 ^. h. y; i5 L& K* O
{5 f( K4 H; j* H; h! @8 Q
        RX_MSG_PROTOCOL buf;+ F, a7 N& ^  P1 L+ x* Q4 |5 q9 T
        
- w6 d5 s1 _! m" c& u: e        buf.a = pshreRAM->a;5 k# Q( M1 D/ ^/ z4 J0 Q
        buf.b = pshreRAM->b;
/ @" U' G5 |1 m        buf.packet_cout = pshreRAM->packet_cout;
7 i6 }6 n" [7 n" r. A; b; x9 Z        
9 P9 u& b0 q# s  o! d  w9 j/ H5 K        if(buf.packet_cout != count_copy)3 w8 V6 X  b, U0 b+ N% t
        {
5 C( g/ }$ s6 s: X                printf("a is %d\n", buf.a);
: }9 }0 ?  G1 R2 P. t                printf("b is %d\n", buf.b);3 i8 `4 C2 T6 s7 U
                printf("count is %d\n", buf.packet_cout);7 l& Z( P9 g# f) P. R7 V0 V
                count_copy = buf.packet_cout;
9 H+ k6 x; }6 D  c        }: s9 ^9 e! e9 i4 F  a/ W! e
        else1 F& Q% y1 ]% L) p; [* i# M
        {. i+ j6 J9 a) E) I
                printf("No effective message!");
7 V% \2 c. S8 O6 s$ ~        }, [3 K) R6 {: g* k
}* F1 B( n% ?$ M
! t5 x4 @1 z8 x, d  Z1 ^5 \: i# ?& x1 k
; m3 B& h; V; ]# w+ m0 y' h
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, Y& ^$ _, t7 b( M, e. i: M$ V9 Y使用下面代码,对内存使用了mmap函数后:
! x+ [1 _5 O6 D+ D! V# y( v0 y; z#include <stdio.h>5 [: ~6 n" v* n& \9 l
#include <unistd.h>
4 T# y8 i% I" P8 x, e; {2 @' p#include <sys/mman.h>4 n; w- ^: v+ z6 l8 C2 m
#include <sys/types.h>
9 E' N3 Q5 P3 [4 w% c5 |#include <fcntl.h>- y' \, A2 s+ C* ~- M

. V! i# a0 f9 p& U' `. a#define SHAER_RAM_BASE_ADDR    (0x80000000)
5 U/ W$ `1 c: \1 X/ b: J2 l: U#define SHAER_RAM_SIZE         (0x20000)   
9 Q, C, n  [0 {$ O2 N  l: U  C( @% R& x+ l) ?5 E( ~- y
typedef struct0 k2 v1 X# A( {
{9 z$ V2 m) L; a0 h  ~: q
        unsigned int a;- i( ?  M( S4 t# K7 _
        unsigned int b;7 ~7 N& \( g* G# q" b2 R; e' [
        unsigned int packet_cout;, |6 f7 j( j1 c, \" ]( i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! k, M' S6 ]+ B6 ]) ~1 d
: C& u) X9 B9 z5 V& k0 Z6 O. _
void read_MSG_buffer(int *baseaddr);
5 r! K+ ]& x0 G8 munsigned int count_copy = 0;* A. M. W) ]& J% X' F4 h# b
! e6 F+ c9 M& O  T
int main()& _$ o: R$ y/ y$ H
{9 I0 i9 e) r/ o5 V6 W
        int fd;$ _. E# h6 H' Q' I% K* @5 N# J
        int *mem = NULL;
  m; \6 P% N5 X1 u1 W  G7 N
- G5 `& t; {$ G/ g7 j% |; D2 `        if((fd = open("/dev/mem", O_RDWR)) <0)/ S/ P1 F; U0 ]4 r
        {
! ]1 c3 K6 h& r+ W6 W/ a! \5 a                perror("open error");
8 x) Z6 _2 U* C$ ^' j, ~; c& f                return -1;2 B/ P) O( z2 Z$ \0 n. g( l8 r) g: A
        }, @2 g" S' v1 M9 T* F1 F: r; x
        % i4 u2 `( v) O- f7 ^+ C" E
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 M6 e2 q0 s/ _* @* o+ P6 b  C$ _7 s: H: Y1 \) o6 Z1 B' l2 f
        while(1)
4 E( u, I/ d4 N        {
7 ^3 \9 }8 V4 C  f: J                read_MSG_buffer(mem);
" w" m" z+ W$ h2 f0 u1 K        }                2 H" v; c/ T; w8 W4 Z5 S
}  Q! H* d' @+ f& N/ L+ O

$ l! n  [5 X+ |/ g+ f3 mvoid read_MSG_buffer(int *baseaddr)( Y3 @0 L4 b! P9 n3 M
{9 i* E; i* Y( ?6 I: D/ m, j$ A$ \7 ]
        pRX_MSG_PROTOCOL pshreRAM = NULL;; U' Z& L6 O( n5 V

8 i4 U( N8 z1 C        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- @. |) b# G, u
5 o* \4 G5 N4 `3 M2 m  A2 |
        if(pshreRAM->packet_cout != count_copy)
' `' E$ s2 Q# O- T# |  j, x% D        {
6 }5 F& x6 r/ n6 v+ E6 k                printf("a is %d\n", pshreRAM->a);# }9 ^/ b3 }0 h4 O, ^
                printf("b is %d\n", pshreRAM->b);1 |" x- e5 F( H. q$ t! P9 }& A
                printf("count is %d\n", pshreRAM->packet_cout);. ~0 c# n% V1 o1 |; R- N
                count_copy = pshreRAM->packet_cout;
, N+ v- ^3 R' t( p4 k& a        }
% O$ `" B5 i5 c2 v$ N6 {7 H1 I        else
9 N9 ^# ?2 z, G, J        {
  v0 u7 A; q3 o                printf("No effective message!\n");
& J+ {) ~0 ^* F. n! Z4 H2 {% O        }
9 G7 Z, p$ p8 F" e8 `8 d- _8 [1 \}& X: D1 ?# e: |, V; {
" }$ b! `4 r3 U& }0 r
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* K% @' u7 y& r0 A

, X: I9 c2 ]8 j* a5 x) e/ v
" B. B( L6 o  G! X0 r
4 C0 g5 |& \+ x0 @! E
- I$ j% x: \3 c, i8 R




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