嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' F/ ?4 @  V3 _" }2 X% s

7 j1 s( t* W% B# W' G8 k! G. }- BOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( n/ h8 H; T% v5 f. m#include <unistd.h>
- y3 H' U' [% ?* J4 E, c#include <sys/mman.h>
5 A7 b. @  N5 d7 A#include <sys/types.h>1 r5 b$ O. C4 P  r' o0 k0 r
#include <fcntl.h>4 z% v4 w! Z2 l! f5 T3 r% l; L

2 X, N  ^4 k, \- H8 r$ s* q: W#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 Q: i4 |7 h8 i% J# i( W& ]5 @% O
typedef struct, L0 n' M" t+ u7 r
{
6 i) C7 _9 i( h; [# C" b( G        unsigned int a;
7 W9 l/ \+ Q( \9 {        unsigned int b;7 k4 k& {; a& y8 m  t% y
        unsigned int packet_cout;
* O+ I3 ~- P4 _1 U& O4 Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, \2 {: w9 ]2 t; Q& ?
% G7 R: a4 G5 Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) X7 X5 y" [; s  A! o/ {unsigned int count_copy = 0;
) ?2 D7 m5 Q" m# t0 j5 Q1 X4 k2 I0 C) U0 y5 K* B: L
: q5 D* H: ~. P2 n7 }3 o
int main()
) Q5 q% R9 Y8 ]{5 s- g" e! ^1 o3 f0 r5 V! h7 ~' h9 }
        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 f0 x! I6 v, _: T! C, X- [        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;5 g& Z, d9 j' U* T5 W
" }8 Z" J& }& \$ v  Z3 Z
        while(1). O3 ~" a) [. W- b7 Y2 F0 N% j# }6 [
        {- L6 t% z3 k/ A; C6 D- D
                read_MSG_buffer(pshreRAM);" A5 t! e! z% K1 X
        }                  O* e7 _( k. u# M3 Y
}
# r+ x4 y( k' B. a) ?! ~# f2 g
7 m* s; _0 _) o3 E4 o3 z5 y6 dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% b: H. `; z; _0 ]6 M( ^* k: U7 y{6 f  W/ k; h  V
        RX_MSG_PROTOCOL buf;# L9 }2 [0 V2 M0 M
        6 f  y4 p/ m& M6 p4 c0 u
        buf.a = pshreRAM->a;9 E! @0 F, {* i: a& T9 \
        buf.b = pshreRAM->b;9 p# c  K# o$ N  V
        buf.packet_cout = pshreRAM->packet_cout;
: _% t0 t7 z  N/ P& m2 e        & p4 l. H: Q6 h, C) y
        if(buf.packet_cout != count_copy)5 l8 J* r% ?* s+ P1 V' x. C* w0 u% z
        {6 \% I+ P3 I& w% Q: O3 c
                printf("a is %d\n", buf.a);
5 d* [4 |7 j; J, Y& ~  e                printf("b is %d\n", buf.b);
# @' B9 O; i% N: s+ T( g% l                printf("count is %d\n", buf.packet_cout);
* ]% Y, k( J! T+ j( M                count_copy = buf.packet_cout;
, M( M: S- {4 x# ^        }9 ~* a% D( S* r$ K6 `$ l
        else' m8 @8 c9 e. G& m8 C3 O5 I; R% B
        {
, v1 H8 U4 w: C/ x! y- H                printf("No effective message!");
- l5 K. o# w; k# }% C        }( @: Q: D# i9 G$ L- L; Q
}7 I; _8 A; T7 y9 J1 y, B+ K
9 p! V$ b* P: b  p9 Z9 o" Z8 m
" a+ M+ v# H$ |% Z9 u) K( D+ v# k
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, _4 R2 ^+ G, b; ^! S使用下面代码,对内存使用了mmap函数后:
( P) e( Y7 f+ ~# m  @: u#include <stdio.h>! X4 e( y8 v: r3 I8 w% ^
#include <unistd.h>
" Z6 B  x0 m/ y8 W3 ^7 p! l7 g#include <sys/mman.h># ~& B4 w3 }. P. n! e+ ^2 H
#include <sys/types.h>4 O, z7 i9 U4 n3 ~) E/ b! X- z. W3 s
#include <fcntl.h>
2 i- y* m, s! [4 Y  o2 O, m2 {9 U
- q$ v# ~& e  _' P6 h) K0 t#define SHAER_RAM_BASE_ADDR    (0x80000000)/ e- F9 ?" e/ @+ s5 U: z
#define SHAER_RAM_SIZE         (0x20000)   
' B' U* A4 F4 Z% `- N# g; F3 n2 U1 J: ^: B8 m1 k
typedef struct
( H' [* L/ s7 t7 z% }! o{3 F8 ^+ b6 _! A8 M
        unsigned int a;" d) D1 F. q$ {& W' p8 d
        unsigned int b;& K% |0 \( u" K1 c& z
        unsigned int packet_cout;
7 F9 V, e! F  g' h: D& s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% h, i! X- `) a, b" q6 D( F
: h8 y$ P7 H; G7 N& k; A8 g. M' h* |4 S/ nvoid read_MSG_buffer(int *baseaddr);
+ x* ^3 I/ x3 [  ]unsigned int count_copy = 0;
, |0 j; n( y# N$ d1 r6 ~% Q- |/ n. }" q3 w+ M4 n( N4 v
int main()
; Q( B2 ]7 I7 W{
3 \2 e7 B% j/ [& G4 ]+ n$ k        int fd;1 }+ B- o& X5 F' F; O8 X
        int *mem = NULL;
( W) i: F/ B4 Z* O0 ]8 s, s3 q5 i- F1 K; A. R1 j" t& W' q
        if((fd = open("/dev/mem", O_RDWR)) <0)0 z8 u/ u. q' j$ X
        {
* N, F1 u4 a* }                perror("open error");, o* J6 g( p3 V8 S/ Q, d
                return -1;
# a' g: z: }9 H8 l6 k        }
9 w$ F3 E; u, P  I8 Y4 @        
  w) I) t5 K+ Y/ O        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, E$ Q: q- a7 d: _; F0 r. r/ r( P( C! V1 X+ M
        while(1). A6 g) o$ A* Y
        {
# S) o6 h- C9 e5 Y                read_MSG_buffer(mem);
- l9 F; L, g2 t- V        }               
  ?8 s, f3 T& O! l( j) O" h}
' c3 [, D. g7 Z1 \* o( Y$ g% m! _& z2 d8 j- n% l7 S) `% f- D
void read_MSG_buffer(int *baseaddr)% b$ d1 O9 m) a7 {2 m
{
+ P' d% D2 V$ @8 s- Q. g7 |% O        pRX_MSG_PROTOCOL pshreRAM = NULL;2 p' }- z1 r" s( K# k8 T( x

0 b9 P* D1 E, f. u7 S" ]$ @3 s# {        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" K  A5 |/ V$ {' y" @6 y8 a' ^/ @; N. P" i
        if(pshreRAM->packet_cout != count_copy)' k$ A% J9 y: l% t! _+ a
        {
5 B; _& C' p5 V# _% J% d% t                printf("a is %d\n", pshreRAM->a);
/ ~% \( c* K4 o' l2 r3 p                printf("b is %d\n", pshreRAM->b);( z) J3 }# h' y+ x5 ~
                printf("count is %d\n", pshreRAM->packet_cout);
4 K: B1 N: c0 W                count_copy = pshreRAM->packet_cout;6 r$ \& d0 K, g! k/ ?4 E
        }
+ q/ C1 M: z. |% R  u: ]        else( q0 M) }: @# V( T+ @" Y
        {7 e  U$ h4 }+ ^) T. u/ Z
                printf("No effective message!\n");4 y1 j7 Q/ B/ z/ u: n$ B5 U+ E
        }9 M3 ^# j* @3 ~; C; S
}8 E' u& L5 O' {& z! [" J! y
/ v" s- `3 K, v1 k
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. s' V* U& D3 ]; W. r
( O- _: z. u" B0 g: f, C; T7 o) Y7 ]0 x, ]
2 N! I7 c6 Q$ ?) Q

" a! E+ K, b# E$ ^6 B
' M/ {, U0 F6 i" ~/ j& `, a+ u




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