嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; @4 g- L0 x9 v$ O; d7 ~  E$ \; i1 r( i5 N( L/ h3 D# P
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% ^( m. J7 t; g1 O$ \+ _, A
#include <unistd.h>" \# `* N& J: M; k* z' y' r
#include <sys/mman.h>
" J, Y, V2 C) T' x+ f#include <sys/types.h>, k, z5 J3 \  L+ \, Y" t  i
#include <fcntl.h>' S7 q2 r2 q! q* z* e, `7 a

/ z- N" i7 n9 `9 w#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 [$ B2 p" O3 I: g, M
; Z9 k' U2 U( A$ Y2 A# {typedef struct
; x% t  P0 O6 ~{$ n3 v# T( N6 I. y& l6 w+ y
        unsigned int a;. }! g# F6 Z$ M5 U3 H* r7 i
        unsigned int b;- l% _* ~, i. P# l. W
        unsigned int packet_cout;5 D. V( ]. x) n2 |* \- H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( f5 H$ O! O" K4 Y% Y* N0 P+ `8 c: G: ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: T, o$ ]& O( q9 l" [5 R7 n
unsigned int count_copy = 0;- p7 `1 J! x  d' O. U
- S2 l( C% D2 v* j, O: I  o

8 ^8 _* Q% d- R- G$ dint main()) _5 ~" T# O3 \5 \! G$ F& e# C
{
; W1 O, R$ L1 R. s        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ d4 u) v( y4 V; }/ O        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 r* ?3 ^9 Y# Q* \& {  Y# C9 i/ b7 D7 d6 C
        while(1). j9 I) ?1 U# j" d5 `0 Q% ?  ]
        {
2 o$ s- [% w: z0 v( o                read_MSG_buffer(pshreRAM);& k) Q* i3 u. \# I
        }               
: o7 x! t' C1 g1 ~4 q( x* E}3 I8 k) \" x. V! B4 p% J
% D# Z9 W2 E% H4 R5 H1 f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" r3 e2 g9 ^- e! c3 d. H" x
{' w# x6 I7 a+ k9 `1 V* K
        RX_MSG_PROTOCOL buf;% j$ L; S2 q2 d
        
$ U8 V, s3 U' x# \' M+ A" |: h        buf.a = pshreRAM->a;7 U4 i- W5 u+ |8 ~  x: S2 ]
        buf.b = pshreRAM->b;7 p2 l5 t* j" P8 H2 E7 F0 B
        buf.packet_cout = pshreRAM->packet_cout;1 y- h0 [. _2 f. I  k/ M( x6 g
        
! F, d$ L% }- O7 l" d( j        if(buf.packet_cout != count_copy)( r2 \& z) z' C: I1 H3 J: R
        {+ ?& A: @3 X& `1 l% s; P: h
                printf("a is %d\n", buf.a);# o, K1 @( |1 j) a
                printf("b is %d\n", buf.b);
9 R0 Z7 E  [  R- V; H                printf("count is %d\n", buf.packet_cout);
4 m1 {) c! L$ G) _' X                count_copy = buf.packet_cout;' w' u  ]! l% a' P7 e7 }8 B  n
        }
+ h# q, [1 |( K8 B$ z3 g# {, u        else# n0 q7 n+ N2 z# z" A$ e. n
        {- ~/ s* z# H7 ?  S9 ?
                printf("No effective message!");+ [) J, l/ M  ?! n
        }
- C" g) A. |$ J: [& z+ Z}4 V) }; j9 d" N' u/ T

9 b& o' Y5 V6 G1 n! o
& j5 R- I- U/ x) J0 o& y" S但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# P$ w- g8 E  Y使用下面代码,对内存使用了mmap函数后:7 t2 |0 Q4 P0 D# F4 p
#include <stdio.h>5 D* t. Q' W8 V* h" M
#include <unistd.h>$ }* v" [# t5 @6 P' R. B! l0 V& V
#include <sys/mman.h>- m* e5 h5 @* u# l
#include <sys/types.h>2 m+ [3 p$ \7 y8 n/ _1 `+ A/ ?
#include <fcntl.h>  I; y/ o: Q, |3 o6 m

  k7 N1 N6 j( H#define SHAER_RAM_BASE_ADDR    (0x80000000)
" n* ~' R% X: I2 F#define SHAER_RAM_SIZE         (0x20000)   
) }6 B& R* ?7 v* d6 B2 w0 g. x- l
& j- y$ G/ l3 y3 V9 Qtypedef struct
2 p0 m0 G9 G2 P5 i0 G& c( d{# K. k/ L, k2 u' l0 b! y) ^; I
        unsigned int a;
: Q: r" H  M* n7 k        unsigned int b;
2 U8 T: V7 r& ]( W6 _        unsigned int packet_cout;
' r9 y2 ^; C+ Q7 ~! T1 W; s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' c) g5 p. o4 N* {3 C) l
9 H" c1 z$ ~; zvoid read_MSG_buffer(int *baseaddr);) M4 Y* R: ^8 H8 B
unsigned int count_copy = 0;
9 `6 D4 F# [! p! t' R# n; j+ u& l( t$ C. n' V& u' H5 V
int main()/ p* H. F* M$ V
{, W" X- j: }0 }
        int fd;
( K0 Q* H# R# p' E' Y3 _        int *mem = NULL;: E9 Z# n# Z/ K% A3 K4 `
" W+ I9 O$ R' W1 H0 F+ w# n+ L! U! x
        if((fd = open("/dev/mem", O_RDWR)) <0)4 X; T( J/ {0 O) s+ N: b
        {
+ J- _: l/ l2 z9 \8 ]                perror("open error");
" d' p) G5 X9 ]# J                return -1;' ?# T) k2 c' Z/ f! T8 O! q
        }: j+ x! E* J) ~& [
          G* L9 e* D$ Y! q% o+ W1 [  x  z
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 m, P; ?) ]9 \  I# t" O( j  d0 N5 ~2 E& k2 z
        while(1); f$ H% z8 ?$ }9 ^
        {5 h/ S: N8 G# Y4 i! g
                read_MSG_buffer(mem);( l5 k) j- W. W1 \& T
        }               
2 \. }) ^& H9 o# {}
2 @  b9 h# i1 F9 S& h& j7 ~: P/ m7 i. i
void read_MSG_buffer(int *baseaddr)" N  M3 g6 {* h) A
{
; D& A; t- _( b& Z( c        pRX_MSG_PROTOCOL pshreRAM = NULL;5 ]; v. K* v6 K8 v( ~# W
/ O$ \& j, r: [
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" S' W, k1 |7 }9 F% C0 y: p
( S0 o) U0 ~$ N# h4 b% R! ?( F        if(pshreRAM->packet_cout != count_copy); g9 |* D( h: P3 @) r
        {: B" i) i- E3 a( k
                printf("a is %d\n", pshreRAM->a);
: j5 H; i- c6 p3 L                printf("b is %d\n", pshreRAM->b);
! d: J# M+ q9 x% g& m                printf("count is %d\n", pshreRAM->packet_cout);: E9 e4 L" k1 }6 q" e7 K9 p
                count_copy = pshreRAM->packet_cout;5 x* o2 ~: L; x# o$ j. @) ^
        }9 t6 I* ]5 D* V. d
        else
/ J* x# ~5 i( M6 p/ w( g6 t        {
* ^/ X. `5 J* D8 K' V0 `                printf("No effective message!\n");9 k1 ?" j% C* M$ c, B! C8 D
        }& X% p! H4 V) L. L
}2 o# [4 e- i6 z1 s0 b; X
; j+ g! D. B; O6 V5 K9 B  R
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 b; Y2 H! ]# R0 a5 p$ u& S9 z& G$ R
1 F2 H( x( B1 x& G' O, }% [( l
9 f- p+ j" z2 P) j8 W2 @

# F# W4 n* D7 @0 \/ K8 n4 j9 l  M% G# r& h/ v1 V# ?





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