嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 i9 K. X: g6 [4 Z: W5 f6 Y  w2 j, b% I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 j- f/ y5 l: Y& D. J) l
#include <unistd.h># b: A4 t, w1 q# V7 W3 `
#include <sys/mman.h>
9 ^  {: k, g$ i5 v5 X( R* R#include <sys/types.h>  A/ e0 p: w1 \4 s6 r+ X) l/ C
#include <fcntl.h>
$ o3 @6 o" v* a+ ]6 V8 i; ^3 ^' }* m/ y
#define SHAER_RAM_BASE_ADDR    (0x80000000)   , {# y7 H- l' g/ g6 i6 u: ^% t/ P0 {

6 ?3 R$ [7 p) \typedef struct
& _6 E% |: j$ @* Z{& g1 A& @6 C) P) H0 S$ K; Y
        unsigned int a;
! A+ G- o5 J  V7 _        unsigned int b;1 D3 q4 ]" R# U( R- b
        unsigned int packet_cout;& C! }6 g* e) M. u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 j, e7 p$ W$ s' f/ B
& `+ V, \& n- ~( c! f& X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: ?% X: }. D1 @+ s; Q
unsigned int count_copy = 0;/ c: Q; \/ h$ t

! a% T+ u& z; [' l. p. v* Q7 l* {% F
int main()
  V0 i" m  |# _2 Y7 I{
+ {% d" y2 R. }) k: `+ ^# ~! B        pRX_MSG_PROTOCOL pshreRAM = NULL;
* y4 S% D3 {* y- w4 X        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ c, `1 L; P& i2 G

1 j0 X) q, P: C' B        while(1)% ?9 w, b) u5 |7 D0 {
        {
7 t  k% Q! u& L; A                read_MSG_buffer(pshreRAM);- X! \  c' @+ a! R7 i; q0 @
        }               
4 s* W5 g( @) X8 P) ^: Q# A}0 P6 w$ o2 c& v- V; H

9 K5 W* s1 h( L- p* D. cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) N  _0 [- F5 [" i
{
* {# d% R7 K" h, }& ^/ E  x        RX_MSG_PROTOCOL buf;
- }) p6 f5 G- k/ M) a( j        
2 s+ Z& |  H! p/ N: P2 N7 S        buf.a = pshreRAM->a;
. z% W6 Y" E. [( j, A7 G. |        buf.b = pshreRAM->b;0 i& `" t% I1 U0 v9 l0 a  I7 m
        buf.packet_cout = pshreRAM->packet_cout;
4 X& Z: \: J! q. @. y        
1 [; `: c: l. U8 Q; [7 g        if(buf.packet_cout != count_copy)
, ]" f) m9 \2 W        {* F* c. @0 {/ v2 l
                printf("a is %d\n", buf.a);. l0 v$ q# Z& V* j7 r
                printf("b is %d\n", buf.b);) g3 P- I, m6 @5 Q' f( g/ L( G
                printf("count is %d\n", buf.packet_cout);
* `3 Y" ^' L) P; u% u                count_copy = buf.packet_cout;
6 I; H. J! f# y% U- b* H( ?8 W3 r1 }4 J        }, V3 b( S- h6 B1 C  e% O
        else
8 x% a" y1 o0 O+ c! v4 c        {
1 X& x+ v# j* _* w+ r0 f                printf("No effective message!");' L, M& y+ O9 U. }
        }
( F  ]' o' h- ?( f& b4 K* B}, a/ Y! Q& {4 y( [- T( ~1 z! }

, v* D; w: ^+ Z# h
7 F7 x  `" m3 E% O但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。5 h6 t" K! G8 y) m
使用下面代码,对内存使用了mmap函数后:6 d% z- s- p/ \  t. c* v5 @; K
#include <stdio.h>
" M1 f  b5 g/ _#include <unistd.h>
! X) y) n" R# ]7 K- B) \2 S2 b' |, K#include <sys/mman.h>, y% a  U2 i& g
#include <sys/types.h>
5 @  y% m4 @' a3 H- J5 u3 W#include <fcntl.h>
/ e8 T+ z6 o; |3 k! D' n6 ?- |
' s& K0 P  H  o#define SHAER_RAM_BASE_ADDR    (0x80000000)
0 I3 ]% Y# v- O) o' }1 z3 v' e#define SHAER_RAM_SIZE         (0x20000)   " |  c' d* W" \/ ?+ J, E: u

' y) I8 J6 f, u5 S5 k0 ^* `  ytypedef struct
9 [! n% k9 e0 D* [8 S% I7 t{
: L$ t! Q8 ]" d  v        unsigned int a;
  R9 i& Y' m$ x8 l        unsigned int b;
) S# [% F2 D& o4 Q, {# G6 L        unsigned int packet_cout;
' Y1 s! P0 r9 j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. O- c* n7 f$ W% X/ \; L/ w! s3 ?# \
, U; Y" z! {/ B) g! f# Fvoid read_MSG_buffer(int *baseaddr);
3 n$ K. U2 ^. O7 c' Bunsigned int count_copy = 0;
1 _2 ]. a) s- \5 w. G
' M4 t3 F4 O* [: r) q7 T" ^. T, aint main()
) d3 a; D( w, t- }{& B% O( h4 }/ w, E) Q: B* g* L) @- |/ f
        int fd;- S2 c) J5 r3 u  M
        int *mem = NULL;: P; z$ o$ b( Q& D1 x/ Y
' x8 X# Y: \1 u, j9 Y; l
        if((fd = open("/dev/mem", O_RDWR)) <0)
6 Z) V7 x: R  ]1 R( Y" ~4 w        {
; i# a' K1 h' i0 l3 d                perror("open error");" F+ k; p+ v$ H
                return -1;
0 ]5 [) `. C5 k; E9 b4 c& B        }
7 ^8 R' S9 E/ H# d7 d: a        # k8 k/ {+ y1 n* d8 A
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  d4 S7 J) W4 _; }( Y6 ~9 H
* [) Z# {% g  p. F% y! }. ^        while(1)& _9 y5 W$ w( v( t
        {
; |+ d% ?- t& V* e% R: W& M2 V                read_MSG_buffer(mem);
+ A: _3 d% _6 r# r$ C        }               
7 y2 n- O* ]: O* @/ `' D+ q}  Q  O; o. C3 j9 a8 Q- y6 F

; k$ E5 v1 f) r6 K8 a9 I" Ovoid read_MSG_buffer(int *baseaddr)% |+ h; r) ^) F: x0 F( B9 ]
{: e# U. y* B' @* L" m
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ Q( f/ Y9 \# m, L$ B( u# X7 C

# ?! W' b' N% u7 F0 w" C, B        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! r1 W3 ?' i, t* W

4 h$ Q! X8 K$ t# P        if(pshreRAM->packet_cout != count_copy)
1 Q' l9 _1 q* H0 {: N, x# |) |        {
& e+ z8 l4 p* C% n( R* \9 D9 n  P$ ]                printf("a is %d\n", pshreRAM->a);. z+ G* j/ j" `! e' `
                printf("b is %d\n", pshreRAM->b);$ Z& n' X$ Z; I
                printf("count is %d\n", pshreRAM->packet_cout);
$ K* i9 U, l6 `# J1 F, j                count_copy = pshreRAM->packet_cout;
( X* i  W; _6 c& E        }+ S: e. m5 b3 p$ O8 i% I
        else
4 }3 a) N1 S: y: V* I* |: e5 i( X        {! a' K: O" A% f  l! N) J9 W1 E
                printf("No effective message!\n");& E6 f3 i. Z& }7 u4 S& ~! l+ G0 e
        }
0 a2 H* b1 Y; x}2 U$ |& ?8 G& V/ E+ F9 h6 i

. M6 O5 Y4 L, c# g7 D没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" p- Y- q. W% M. G
, C' ?/ P' m! @3 }/ S
; ?. `, @- `0 U: D& A6 ^

! o9 k1 T9 B, v. M' Y# W6 X/ f( a' ?





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