嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' q+ g3 N: f3 Y- @0 H$ J
) ~6 _  a* s, A
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ f/ H0 V0 u' C, `4 Q
#include <unistd.h>6 ]0 d  W+ _: S# @
#include <sys/mman.h>/ ^8 s; V( U7 \( X
#include <sys/types.h>
. o3 n6 ]. ^8 Y# J#include <fcntl.h>7 H  m$ X& K0 {" s

, K  M1 C1 Q- X) V0 B4 m#define SHAER_RAM_BASE_ADDR    (0x80000000)   
! ?; E1 Q" a# N; K9 I0 G& ^2 c2 ?5 M8 D& }
typedef struct
# u2 O1 W/ C5 L. N: h3 {) C3 o{
) B& @5 _# J) I8 _/ U        unsigned int a;
/ q# R6 J& F8 ]8 z        unsigned int b;
$ W. |- ]3 b7 B! b/ Y8 v! w        unsigned int packet_cout;* u9 [; R8 @% j3 H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 `0 I- a; R' s- \
2 `9 ?% O/ q( q* z4 L0 _. p! e! U( a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 @' p0 j0 [& C- K0 J8 cunsigned int count_copy = 0;3 w4 }4 M, c6 U, i% E0 @, Q: T' n
6 X3 I( d# M" \& H4 N2 o! h9 V
' T& p4 e# l, h2 K, o
int main()
6 r' h5 f; O! B1 I/ Q7 v{+ o4 k" A5 [1 c$ n
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! A. r5 U, p: Q! d        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 r+ Q. @5 V3 z9 [0 K" Q2 J& A% q
- S, l: b' |: F7 \/ Z
        while(1)
$ p, o/ O$ s  A; S, R3 ^        {
/ c: e; \; h. A( H1 f                read_MSG_buffer(pshreRAM);$ B' i9 w; j$ T9 |1 v' h2 [
        }                / p- s  @8 M9 I  _0 X! m
}
, ?* P/ ^9 j6 v% R/ T& c9 z/ `
8 K+ B9 Q, V- ?) M7 ^3 ~4 Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 H/ M( A2 e  t& `9 s! D, i
{
8 D2 A0 H& H( S        RX_MSG_PROTOCOL buf;
# \! i3 {4 U7 ^3 D( ~        : G4 z9 [& _" V' o
        buf.a = pshreRAM->a;5 O- g- N; _" K) p
        buf.b = pshreRAM->b;' Z4 G+ b$ ?# ~8 W
        buf.packet_cout = pshreRAM->packet_cout;7 _( C3 {" W1 u( m9 m6 ~
        & X+ |+ t; V8 [% j& V
        if(buf.packet_cout != count_copy)
0 T; j, n4 }% |! c        {
3 U5 @" \3 J" \7 _! ?                printf("a is %d\n", buf.a);* z( c4 @) g" J0 Q2 f9 [* t: e
                printf("b is %d\n", buf.b);
% S8 a, {+ o4 U' P! v7 E# u( Y                printf("count is %d\n", buf.packet_cout);
+ m+ V  P6 S' P# `4 C( }8 q3 y                count_copy = buf.packet_cout;% f' @1 o0 ?- i7 X
        }7 Z* y" J2 _1 s+ G4 n# }
        else. k, W* N* }8 o( g# I  i* q
        {
! l. B0 e2 r3 i: J( `' k' O9 o                printf("No effective message!");
; H5 H+ M' Q  J/ y3 q" Y2 j& f7 d        }
9 Y" A, j8 P  L  D+ E8 j}
7 d4 j/ C) y% G% s2 E: _0 A) Y

2 x8 T# w' q) v8 N: N2 `% s但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 P# G- l& i/ T7 Q- P使用下面代码,对内存使用了mmap函数后:
4 c* V8 l. R& A6 A#include <stdio.h>6 b5 d. f- }' I
#include <unistd.h>
/ i6 p6 z2 E3 G$ K#include <sys/mman.h>* a: \) G9 F1 f$ y& T: Q1 d: K
#include <sys/types.h>
) c1 }4 ^- M9 C& |! e#include <fcntl.h>
8 W1 I4 c1 N& L) w: g( l3 C- X" ?9 ?  q: u' D$ E8 n4 F3 N
#define SHAER_RAM_BASE_ADDR    (0x80000000)
# f& q$ l5 c( `, V#define SHAER_RAM_SIZE         (0x20000)   ' w& n! `( ~* P, D3 ^. z) i+ @6 W

- |7 N$ _  j4 C6 j, n* Ytypedef struct
, `0 N( i1 d" w" @+ o{
3 n) G. c2 K5 I. Q/ M' P( e        unsigned int a;
! X3 b7 ?; V, i$ {  Y        unsigned int b;% n& b' {* q0 C! ~' n' |7 X( T& E
        unsigned int packet_cout;1 Z. e8 K: F7 k, L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" |! A2 c, i) b* o7 c
% F* i  _% y2 H: x$ B5 w% kvoid read_MSG_buffer(int *baseaddr);4 U2 l  H; t% L; u! c
unsigned int count_copy = 0;) Y0 O4 k/ g/ C7 u7 Z) q9 c6 R- D
1 `0 g4 B. t) G, d! P$ S* h% r( F8 K
int main()
5 b& ^  S. d8 N2 N8 I1 S{
* p/ r( d  c9 Q+ C        int fd;( |- H0 l% p- p' v) i5 s: Q( U- K! a
        int *mem = NULL;+ Q2 q, t  H; S5 O/ C

5 q9 R4 T  P! J# }: G        if((fd = open("/dev/mem", O_RDWR)) <0)# n- v1 f" O+ }8 \, y% k% e
        {
2 _7 p7 H9 c( m6 u/ k2 J1 v                perror("open error");7 q3 c8 j1 y4 I6 G$ j3 {
                return -1;
& B% m2 i* p5 D        }* F$ ^  [" m0 t1 d2 o
        / ?; b; D4 P2 O2 i& F
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  u( X6 Q/ y: N3 |  Q6 U+ g) O6 @: ~; r2 }
        while(1)
0 a1 D2 d& [( s. d2 C$ i        {1 u* y0 _. y/ I: [. E" n5 h
                read_MSG_buffer(mem);
9 O( E2 U6 w# e" _        }                $ j/ |7 }3 e& X! j% g# W
}( O+ k, F' u& j* M: W

+ H1 p: ~" H& \* n4 w! e; R! k. cvoid read_MSG_buffer(int *baseaddr)9 i7 q. }9 ^' L; ^
{: Q' ?9 t  P1 `  E7 d! G
        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 Q8 [9 `1 R* e: U% B* ]
, b* Z, q3 p, @) o+ ~5 W        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 X6 A7 x2 g1 q' {
1 k6 ^8 T: L* x( S( c" l, r        if(pshreRAM->packet_cout != count_copy)" ]+ }3 n$ O$ i5 B! @2 n! n
        {( w$ l8 }# X/ M& m( M$ q  ]* b
                printf("a is %d\n", pshreRAM->a);
! d- L; f% G9 `# r5 q4 r! O                printf("b is %d\n", pshreRAM->b);: `) U8 h- O' d( H
                printf("count is %d\n", pshreRAM->packet_cout);
9 L; L5 @4 d  ?3 \7 ]- A" u                count_copy = pshreRAM->packet_cout;
- I7 @# e" y+ T) n: h" Q        }
) `) p( {8 v3 p  S  r# @5 i7 B        else
! f  O$ M0 F% H1 {- E% M        {: ~: R; q/ ]3 S; u( m2 W
                printf("No effective message!\n");, K  i1 ]* Z6 a) }: K/ O/ H
        }
8 E4 G6 o5 H. o0 H/ Z" Q}' ~' M0 w) }7 w" U

, [! Y( {" B1 @, c" N没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! M+ A' K9 z0 ~& r) I4 M

: n2 Q  q0 D5 [* A% N$ M0 `* `- N0 p% {/ A. K; r5 q

' m* U0 w5 \4 F- V. S$ G
+ ]! C. Q. v" G( G' D6 Z




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