嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 u# V! L% i; C; ^9 A% r+ @
4 N; @0 x' K' C9 ?
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 O* |, X' n$ w& V6 ^  A, n#include <unistd.h>( [, C* E: I% m% y+ o% a6 Y" c& f
#include <sys/mman.h>
7 `  ?( J+ U0 d- R#include <sys/types.h>9 T4 G" S! C- x8 U7 d, v6 Y
#include <fcntl.h>
% y; v. @9 B6 Q
5 h# H5 p  p9 l* V% {1 P#define SHAER_RAM_BASE_ADDR    (0x80000000)   
0 c3 @$ p" V$ r* {7 K7 n$ w4 I9 H
  a7 F0 \( ~- ^: G+ ]typedef struct
! W" q' j/ u" }+ w{
$ V. _/ y; V* R  Z6 Y2 O7 j" D        unsigned int a;$ d- S  h# A. |3 E$ l- M3 j
        unsigned int b;5 Q8 t1 G) c8 H- Z4 H
        unsigned int packet_cout;
7 l- p6 [  ~9 i3 o7 d( S+ F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ q( T% d9 g4 k0 i- Z' m
( }  \# d0 G4 s2 c* D  D. {void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 q9 {* ^. ]. P- @: H
unsigned int count_copy = 0;
" B: n0 e7 O- ]& I* n
% |6 b) Z: i7 d2 i) N, r! h. j$ c. k: p
int main()
6 C+ O, Z& ]% d- q+ s8 l{
; R& T/ a2 ]8 z        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 ?+ ^/ `  |0 C5 Y$ e        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 Z! ^. \6 U7 R* o
8 c$ j3 b1 y5 a9 P        while(1)- T/ }% V! H# _( e7 z; E; b* ]7 V
        {
8 j, e3 t9 I3 u; D5 p% F' U' [: d                read_MSG_buffer(pshreRAM);8 I4 |) ?1 X4 w8 J9 d
        }               
; K2 b& I8 M- r- o5 i}2 D: z4 M# r% H+ P/ J
4 H) R* D9 z3 l" D/ G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" S) r8 h; f3 Q
{
7 Q) x9 X9 Q. S% W        RX_MSG_PROTOCOL buf;
+ E3 P' Y1 W% [' ?9 E% F4 l        
' F) f! L+ d$ `& _5 ^7 i        buf.a = pshreRAM->a;
/ c; L+ [9 G( s: o% f        buf.b = pshreRAM->b;
# |+ x$ j0 C4 G% B; u' l        buf.packet_cout = pshreRAM->packet_cout;# M; v% {- a' u) O& U5 e- I
        
" b2 C+ o9 k8 X+ h$ {        if(buf.packet_cout != count_copy)
7 G2 ~6 [: S" k0 R" O. r        {
5 ]8 S7 Q, P' D2 y( K, f                printf("a is %d\n", buf.a);; k; ?8 W& X5 |7 y! q
                printf("b is %d\n", buf.b);: l% {+ Z. x* r) ^. K
                printf("count is %d\n", buf.packet_cout);/ M5 c+ V& C5 R% V( i$ U
                count_copy = buf.packet_cout;
. L1 r: b6 J$ \* B6 }- l. V) f, ?; O        }* A5 l. u, P5 |7 n. s$ [
        else8 [3 ^3 A: v0 K- U  b3 {1 I5 f
        {, l- b! x3 M, M0 b1 f" m: P
                printf("No effective message!");/ j! U; f+ m- k" }8 {
        }* S/ q& z6 B: K0 v8 p6 Y( m/ `
}
: ?4 Y7 a) N& N- C# _, h! a$ j& C6 M# }8 J9 @
; L/ `% G, ^  A, }( w$ m, N" u
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: Y$ B. @, ]; z# j- o2 I# K0 m4 u0 H使用下面代码,对内存使用了mmap函数后:2 A. U% Z0 t1 M5 Q' B) V6 P  n
#include <stdio.h>, w& L3 ^, r/ w5 g2 q$ ?) x
#include <unistd.h>6 m9 ]8 _" O+ W5 K" g& ]( Y
#include <sys/mman.h>$ u; F; L8 ?! }* g- s3 j
#include <sys/types.h>
6 K* ?; C2 u0 L8 f; v#include <fcntl.h>' J: Q! v7 F) t6 ^
1 w: U/ |& {$ c2 N1 b/ u
#define SHAER_RAM_BASE_ADDR    (0x80000000)
% a, @. L) h4 s3 C- Q#define SHAER_RAM_SIZE         (0x20000)   
7 R. Q: t8 u( T* n- W
4 h# Y/ m% N0 H( T4 h6 K( itypedef struct& A$ M$ ~) b* }. D
{
# C0 p+ v+ Y8 B& u% |! j        unsigned int a;0 h( A$ [, k- d) q+ Z( x+ t
        unsigned int b;
' Q6 F4 i5 z$ e5 t+ a        unsigned int packet_cout;
! A3 {  B$ I5 a6 v8 m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 q( o% }) e4 b" V* g
* L9 L# s" [" E1 X( c, y/ \void read_MSG_buffer(int *baseaddr);
- n* r% O: ?+ u6 V9 h" v5 J% tunsigned int count_copy = 0;
5 f+ C0 a& c2 X4 g1 ^8 I
$ }. J. W, T3 a, q) x# D/ I* }( Oint main()4 y: @1 d$ T0 d, C- S
{2 k% P# N- v; G% X2 V2 ]
        int fd;- ]. L: F! m, u0 A7 A' m& S; K  f
        int *mem = NULL;
1 \$ b) S6 k) M% Z
5 P& G. d2 B1 z8 o) P        if((fd = open("/dev/mem", O_RDWR)) <0)
0 O( i7 {; D4 Y        {
; |8 r, w. G& c4 s( K) r( ]* j                perror("open error");
, K5 n! j7 b5 P, e) v2 H; I8 e                return -1;" d+ V. J4 q; x4 \
        }% h; B& C% u5 @+ Y
        
3 y! A! D& E+ {: C9 R5 J2 v        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 {+ ?% C( S  c! J" V  Y8 E

8 K! R3 p: c# W4 E. V" Y        while(1)* w' e: Q, D% l5 \- }6 T" J& n& \
        {
1 N# ?2 ~& \4 C, y0 x7 K9 ~6 I/ O                read_MSG_buffer(mem);4 ?/ ]0 O) m8 X5 H
        }                7 K7 i8 j8 v, j! T! z  h
}
9 F  o' a1 ^; _, q" x- i
1 x; B; j) C8 O( b% Fvoid read_MSG_buffer(int *baseaddr)* w" K3 f& U' B3 e* x
{
! t% B1 T% ?; O4 K        pRX_MSG_PROTOCOL pshreRAM = NULL;4 d) u3 P$ Y* E( |/ m- x

# \0 a' N8 Y7 P9 F5 X        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 A* G/ [8 w; m- Z. B9 m# c3 G  I8 l

1 |- C: V2 n* U; K. M( g        if(pshreRAM->packet_cout != count_copy)
& D& N2 I6 A9 {" @8 ^+ r        {
; v" y7 a8 l' }5 M' }, O                printf("a is %d\n", pshreRAM->a);
6 ?6 @% G# e' E+ }                printf("b is %d\n", pshreRAM->b);
* q3 w9 J, D% q  X+ Q2 K7 M                printf("count is %d\n", pshreRAM->packet_cout);$ D5 |! w0 t1 ]: o) R& E" V- l& X2 G% x
                count_copy = pshreRAM->packet_cout;
* m1 \$ e( e- T2 H, W5 |        }
) o- q, @( ?- Z( f. C5 G5 d5 |* ?2 o        else
- u6 ^9 R, @" d, Z( Z; r& V: D        {- [" E2 \4 T  c4 m. {: f
                printf("No effective message!\n");
$ E; @  a. G- i8 u. a7 s) s        }
' P8 A( G( d4 ?! W; j}
' O) P) Y8 H3 |5 K
0 Y6 g  j$ w7 l) e! k0 [3 _没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. v1 M: C9 W# r  ~6 I1 p# T
3 e9 j8 f/ C/ E0 c

1 ]4 ^2 ]; W2 p  @, ^
& I) ^. G$ v; F- t* M
  B- ~0 x* q: G' P5 g




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