嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) ?1 z' A$ b% M. n7 j  ]) {  j+ |: p7 }+ g% R" {) G
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
  Q, I0 A' T5 C9 J9 f5 d, i- j#include <unistd.h>
2 ]. f# z. t/ R0 @8 b#include <sys/mman.h>
* R2 q2 ?9 q+ L. n#include <sys/types.h>
+ @; Z, L/ L: e+ d7 r% b, o#include <fcntl.h>$ a$ P) l% I, B

! T) ^+ C; r0 t8 H3 X5 }#define SHAER_RAM_BASE_ADDR    (0x80000000)   
" I- }! U" u* x, l$ V
0 y% H) |0 w4 \5 t8 Dtypedef struct2 w# R( ~* @+ F
{
$ Z: p0 a+ v, X9 J        unsigned int a;
# B* Y$ O: g# M% S1 u* R        unsigned int b;4 C( e) w' o+ ]: }, R9 e
        unsigned int packet_cout;; A( {& V' \; c, r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& g: H0 _$ T4 `2 h

: _) R. d0 @. Q" |1 [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 L. r9 n4 }$ C
unsigned int count_copy = 0;
- K4 k$ U3 l. U7 Q# C$ T0 F
3 b* v$ c( J# h- n. B9 d/ [8 [( y' n) f* `; u
int main()
9 M) Q9 q  u) ~/ J9 U( l{
! s* G9 e; p, c, ~        pRX_MSG_PROTOCOL pshreRAM = NULL;. f) R$ T% m' h; {
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  ]) O7 C2 i, @6 S. @/ r" m+ E: S8 F/ |1 [  J+ R/ Y( r
        while(1)
8 k" z& S9 }0 M& I$ T" `        {
- N, E8 u/ A) J7 d. b                read_MSG_buffer(pshreRAM);
! }7 D- K8 R. ~2 N        }                + @! r; U7 M' U
}
. t2 H7 i" }) G
9 A1 \+ V( D/ n7 F* @5 S+ Q4 Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ j4 z3 A9 Y3 B$ @+ n2 L* h{
+ u" x% {7 e0 n0 J8 {- \" `        RX_MSG_PROTOCOL buf;9 g# k& y3 k+ I$ y% G
        8 }5 D+ O6 j6 I5 n% |! j
        buf.a = pshreRAM->a;! G8 f0 j* P1 ^5 n7 B. p0 D& s! E
        buf.b = pshreRAM->b;
) \' k3 a; |. m8 |; u        buf.packet_cout = pshreRAM->packet_cout;5 D0 _+ P, Y* l& v1 `& h4 X
        
! |  p3 V- |7 s; v( |! G5 D. ?+ W        if(buf.packet_cout != count_copy)
" _6 V0 N% t( n        {: I) }8 ?. S1 Q: ^
                printf("a is %d\n", buf.a);" A: a3 U4 |' S- h( o, g. |
                printf("b is %d\n", buf.b);
) G8 H& i% E! E                printf("count is %d\n", buf.packet_cout);1 `; r* [( H' a% {$ }/ ]+ j) g
                count_copy = buf.packet_cout;: z0 ?; `" O; V# X
        }5 o) V( X- r: }( w( w
        else
8 x5 P$ b2 u+ Y! ]  u. u9 y$ `        {/ t# j" _3 j' B
                printf("No effective message!");6 {( ^5 V2 U' j. x
        }
/ D$ R9 P: z* {# L) t}
+ W' k6 F( @+ p2 H; }/ \3 p  Z5 R4 U; x1 @" ^% t9 V2 i) z
* v' T5 k7 x: P
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' r- m) S. x. }7 k使用下面代码,对内存使用了mmap函数后:
4 q' C) C4 |; k3 c  p6 n5 r5 |- c#include <stdio.h>
' Z+ Z4 N# _  l5 [5 x#include <unistd.h>
* j+ P% A, L* A$ q+ a% X#include <sys/mman.h>
& H1 c9 S. W6 W  r/ y$ [* y, d6 R#include <sys/types.h>6 q1 T* G2 V& \  S8 U
#include <fcntl.h>8 [, @6 b6 W+ e2 p
! y" e+ S5 R9 P5 n* i: d+ }6 t) Q
#define SHAER_RAM_BASE_ADDR    (0x80000000)7 W0 h2 r# l) ~8 W9 o( u2 E
#define SHAER_RAM_SIZE         (0x20000)   9 {7 F% i( l- U( _: i& D

0 B$ o' Q3 F2 n( L" dtypedef struct
; p. {$ g9 B$ S1 |( R) m$ i2 l+ j{
& K' N! G( C3 [: F3 Z9 R        unsigned int a;( F$ j- ]1 R* ^8 ]
        unsigned int b;: l$ l# z! A" V& w
        unsigned int packet_cout;# f* G# t% Y, r' i- e" E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' D' m  B7 x4 f; U& u: |# C5 a
1 B# |- \) R1 {
void read_MSG_buffer(int *baseaddr);
5 w1 ~% H$ y1 |; ]unsigned int count_copy = 0;
6 F( N! l: f2 C5 V) M+ K4 V- q0 A( J& c
int main()& F. G- O% ?. \% L
{) V7 w3 ^+ c3 h; N9 W) q
        int fd;7 ^: T  g, u" i( O7 p
        int *mem = NULL;5 }1 F, k! m5 p) x
- v- V5 P5 s$ w8 ~! N; D( v' _
        if((fd = open("/dev/mem", O_RDWR)) <0)& `( H9 U) O% D8 K
        {
& X8 q; V# q1 I2 e1 M5 C                perror("open error");
+ }8 S; q* G: X1 i                return -1;
" g! q/ e& k9 A( D4 w! v8 |        }1 k+ q( U) V8 `1 C0 @
        
2 t  Z4 x  t# x6 ]3 H        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# {- O6 n* t9 R9 {$ _& b, A) ?! Z
, R5 Z: ]5 @1 M- G! u        while(1)' r9 W( Y% `! a( b. q
        {4 ]" {! [; K/ n5 v) r) m
                read_MSG_buffer(mem);( }/ m* W8 i5 _
        }               
) @* V  T* h3 }+ J. j& R5 m  W}
7 m6 ?- h& y3 L$ V( q6 o1 E: r8 a6 m
void read_MSG_buffer(int *baseaddr)/ z( s* |! b' D1 B' {
{5 E1 S5 H+ J+ U! D" v
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# p$ G8 i4 n$ I2 l" c* B$ V1 [; Y
) S+ E9 H5 C' {        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 Z* I$ w/ A3 Z) D8 A/ b5 U: X" O  f. _% r& \# t2 S
        if(pshreRAM->packet_cout != count_copy)
+ Y9 [# i1 @3 S  m7 O! o        {
9 y- O& k' Y+ r6 _9 R9 j                printf("a is %d\n", pshreRAM->a);3 }& _5 D! z- C. T& d" V
                printf("b is %d\n", pshreRAM->b);
3 I) A) ?; D& [                printf("count is %d\n", pshreRAM->packet_cout);* F& D; b# S5 v$ ~
                count_copy = pshreRAM->packet_cout;
$ q6 W1 l: b; Z        }
$ f2 U7 `: ]6 k3 z/ z        else
) [. p) r% h. F: S        {6 S- F" S6 P& Q
                printf("No effective message!\n");
- N# U3 p( c/ Y0 R2 P: T9 G        }4 w. `# F$ @- B9 b
}1 ^/ m- T! E% \8 E8 w

0 I- U) W6 ~8 }没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???2 \6 r, f" q# e7 z: u
- E2 H! o( u! m$ y, u

" q& Y+ A% Q# u, ^
2 [* n0 d, X* `- K# _5 R
( a# G+ G8 j6 M$ F# t) e6 }




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