嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - ~' I3 l6 m" N/ c
% o7 m" t6 i: O+ M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" i3 T( h3 {" b' q& G: l8 A#include <unistd.h># @1 X- M- E7 i) W2 I
#include <sys/mman.h>( e4 [9 E8 x: b4 b* }' G! @
#include <sys/types.h>
: k9 R* B' A2 ?7 B#include <fcntl.h>1 G+ x. Z# `" s) ~" T

& n) A) _' p$ U4 e" [, U+ W#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ z+ o; Y; m, O. H* U

. x, J; E  D  k% z- [2 P( vtypedef struct
! |- I- f$ z' e3 S9 P) E" Y, P9 D) u{
& C2 X2 W4 t( M  A' P        unsigned int a;  D2 i" R0 Z2 r! h  v
        unsigned int b;
* Y4 a: @1 ^$ C' p( j        unsigned int packet_cout;( ?+ Q2 k2 X0 G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 ~& h  J* L5 s8 R  M+ m
9 P9 C, O6 G; a- b& ], d2 uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 V7 i# N- p  punsigned int count_copy = 0;
& o; ?9 C1 ?8 T4 w$ C. X. r, }; v: W

. p7 a7 R8 {, M9 {- v8 Hint main()
6 ~+ Y; E# e5 e{7 b/ V* b& h  J/ I8 o7 u2 O
        pRX_MSG_PROTOCOL pshreRAM = NULL;
& E. m5 l+ N. G) ~7 v5 B% {        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ z1 Q9 b! I( ^& B

6 d' g+ }+ _! h. T" o# u        while(1)( k; p3 C' V* `7 _# y0 M
        {7 a5 h* Z0 |" k  @! [& @' n
                read_MSG_buffer(pshreRAM);. w$ ^6 _2 z9 s7 Q) n, C
        }                5 ]* t1 a' H  }) E$ l! G: `
}
% b* u; t" G' l$ L9 R/ P, |8 M  X. J: |+ f4 }7 p9 [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* B/ c/ o- I7 B7 P{
0 j& @1 h( l' w) X$ O        RX_MSG_PROTOCOL buf;
+ F& r6 }- ~7 J2 j" @  N        0 N+ ?" j+ x% x) {
        buf.a = pshreRAM->a;) P4 e2 z# a9 V" c/ X( w
        buf.b = pshreRAM->b;5 K* [8 d; a; G2 U. z4 e
        buf.packet_cout = pshreRAM->packet_cout;# x  a  \- X" d8 q
        
0 x6 ]# C1 P1 J, k8 B8 b% w! j        if(buf.packet_cout != count_copy)
( ^$ u+ K. Q5 h, S! Q        {
/ y* ]! ]8 p: |4 T  n- [0 y                printf("a is %d\n", buf.a);
% l1 y% I2 i0 f4 z/ ?2 j                printf("b is %d\n", buf.b);3 V: E) u6 W$ ?
                printf("count is %d\n", buf.packet_cout);: S* g1 ]* D( Y0 ~! ^' c8 G" G. M
                count_copy = buf.packet_cout;
4 }: ~( b+ O& \3 M0 |3 `" _        }
; N' z1 k( v& E0 m- v        else+ q8 v0 t8 H4 x! Z3 X
        {
4 V% H4 `% H8 a& P                printf("No effective message!");
/ h  N, A# F, h9 f( ^4 j        }2 B, y# s- e9 H3 h- Q5 \' S+ x
}
0 K& y+ \5 p$ I. q
# w2 R0 N0 T( U' H8 r  c$ l
2 z! T$ e1 e( {3 V1 \7 p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 X! r7 Z6 H9 E+ K$ a5 [
使用下面代码,对内存使用了mmap函数后:
3 z: y- w' |3 |% M/ }6 G8 c$ A! S#include <stdio.h>
' y$ B* \/ W2 q" e6 ~9 i5 Q" p#include <unistd.h>
3 q6 O* T4 h8 @, Q2 D. i: [#include <sys/mman.h>  _% G6 N+ G' G
#include <sys/types.h>% ?* u: \. b- B5 u3 _7 J7 t0 i$ j
#include <fcntl.h>7 L5 W5 ~- S0 z4 T. L- a
; B% u; W6 u2 R- a
#define SHAER_RAM_BASE_ADDR    (0x80000000)' S) M3 C) v% S$ n* M
#define SHAER_RAM_SIZE         (0x20000)   3 U( j) T; i- O
5 |2 f) L, w) \6 p9 j- B2 ]0 u
typedef struct
6 v, G5 _+ P( \{
( b! N& v0 p, d9 q9 J: e" Y! F        unsigned int a;
7 r' r9 I7 }8 @/ {4 d: C' @8 i        unsigned int b;
/ L- w9 s6 @- B" `. b0 I! j' Z        unsigned int packet_cout;
- ?; A. @  S! B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 s0 `* l6 J, G( v1 W) G; h# B% B$ P9 j4 a& h% \1 R5 T
void read_MSG_buffer(int *baseaddr);
" C7 M. q3 J$ {unsigned int count_copy = 0;, b: n3 k6 b+ d
1 t( n( }0 V: i; n+ F) J" ?+ G$ Y
int main()
# U+ L/ X7 y, M{6 S$ o0 G2 s; e
        int fd;
* N, {# s% ~$ l6 t        int *mem = NULL;
% S' R/ X: ]9 Z% S5 k; b7 [6 E& o
1 V% n( @* A2 }        if((fd = open("/dev/mem", O_RDWR)) <0)5 _) C( o+ f. I
        {% y0 V: \# r5 i1 B
                perror("open error");: H) ]$ q% Y- ?" }4 A
                return -1;( J4 D* h; _8 r* p: ?$ F
        }
* f3 r; o1 C+ ]: G1 B1 _        
- {6 r0 B7 I( |4 w4 q5 r5 ^2 V9 g" ~        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) u1 o' V4 Z- M5 I" R$ @. @2 j  T; l; T' `
        while(1)0 f6 o& c* S9 D
        {$ M9 y9 V, B5 d
                read_MSG_buffer(mem);. [) p7 r  u/ A
        }               
7 T; O' i" H2 E7 x6 j% n$ b}
: O, Y! }/ M9 P
3 d, N1 W) T  @$ I: ?void read_MSG_buffer(int *baseaddr)
- i4 Z# x, l7 @- t9 V' u{
2 t9 s% f( [) _7 D' E        pRX_MSG_PROTOCOL pshreRAM = NULL;& _* z+ l7 O. N0 ^0 W, B
* a5 s' O, w7 k  _# C% D" B
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! U  a' R5 U: e4 S: L% W- ?/ g/ _& I# I; q
        if(pshreRAM->packet_cout != count_copy)
3 [. r, u2 d+ [        {. L/ I" H) L1 W3 {+ s# i
                printf("a is %d\n", pshreRAM->a);
# {% l1 R- H  j$ |4 [* f                printf("b is %d\n", pshreRAM->b);1 X  h! v1 U3 k2 M
                printf("count is %d\n", pshreRAM->packet_cout);6 e2 C, @& G$ d2 k6 \7 ~
                count_copy = pshreRAM->packet_cout;$ b) T; c$ K  k! O* e0 s* }
        }
) Q. }6 g- T, M" {& {# N        else
" a0 T9 k( U3 ^4 i2 s8 T        {# \: a, t# g$ e5 }0 y
                printf("No effective message!\n");* d( Q" [1 I# G3 i% ~  |
        }! B4 U0 n7 N# N3 g" D- Z2 b' \6 y/ h
}$ N' R; H/ [  W6 P* ~7 p) h

6 k; Z, I% f: t6 n6 n( H4 t" b9 y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* _# g# ?+ W0 M0 x$ W. [  T' D# t( X; \( {# T' X+ u
2 g. M: |9 C1 \. C: l' t! s
1 j. S( P. z! U5 r6 g4 ?+ T

% T+ R3 f3 R) b; K  E




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