嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ |0 g2 t7 j. u9 \: Y) L7 X/ m  o. Q9 q" i4 a7 [) t
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; U7 j7 x( v4 T! E4 J( {#include <unistd.h>/ G4 b. K* B* L8 k! I
#include <sys/mman.h>
% k0 j0 Y7 n4 v" l0 k, S#include <sys/types.h>0 o1 g6 N3 N2 \+ k1 ?
#include <fcntl.h>0 G  L$ ?/ Z/ I8 m/ p. I
( c5 p& @5 N5 @5 p9 Y% Q9 p, U
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! a' u, W* G. p& n; [$ b2 S0 Z0 b

) G4 S, l  \+ \5 n9 g& s! atypedef struct( Q  W- \7 Y, B! Y! p
{4 R) d( P/ x6 ]3 H2 P* G, z
        unsigned int a;. j* @& N( q+ B* q! n+ j; H& l
        unsigned int b;
& K0 C' P+ f8 |1 S        unsigned int packet_cout;  i) I% A9 h9 P' O' G# ~  ?# j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- s* F, b3 [9 _3 P2 a0 w4 k: c7 K
$ n# s+ Z6 `5 C' _" B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) L0 I& D+ N3 Z$ Lunsigned int count_copy = 0;' ?' J$ |: l4 P
0 c6 f3 B" a; X. a% _2 o0 U
3 |- [: g$ [* K2 h, R$ I
int main()
; f9 G/ h7 Z) T* K, }{
. B* `  s' Z) l9 z( i' [        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 [: h9 b; k4 W6 ]        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 Q2 g# T0 @; `

4 p: N5 P  V5 v- b& k        while(1)
, D" ]: ?8 K: w8 ~2 F* l0 h        {
/ `) L4 l5 u) d. x                read_MSG_buffer(pshreRAM);2 ]4 O3 S/ h+ v( I, m$ X
        }                : V% q( S6 P5 g% n
}
" Z1 r9 F+ \8 C/ n0 z# x* j
% W. S% _8 R/ x( D/ Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  }4 x2 i( u, ]9 G1 r  a{
% _- b$ g- Y. R; E5 [6 B! x3 d6 z- \        RX_MSG_PROTOCOL buf;! J7 n4 q: ?" s$ K: X
        7 y6 z  R/ u. o( a0 X( U
        buf.a = pshreRAM->a;; \# Q5 ]0 I* [" g
        buf.b = pshreRAM->b;
" X- P- `6 y7 e( v2 q) o        buf.packet_cout = pshreRAM->packet_cout;
0 J. n" F6 ]% x8 m        
4 ^. u1 `) ~' ^4 k  f; `; L" N        if(buf.packet_cout != count_copy)% f5 n4 t& W7 o) M$ F  k! _  S
        {
% n/ G2 W$ c; t% h9 Y8 p                printf("a is %d\n", buf.a);
4 A: g5 |# P. g/ ^5 F                printf("b is %d\n", buf.b);1 \2 U! z! j. v; p
                printf("count is %d\n", buf.packet_cout);+ \+ ]. F- `/ d
                count_copy = buf.packet_cout;! U5 q5 z1 `- h( @% L
        }% @) Q$ J2 A  Z- t
        else
4 M$ P! K9 K/ Q% [% r4 v        {
; G4 {: B5 p" Q3 C  H8 o                printf("No effective message!");
# S7 s5 ~3 a8 q5 g        }4 l0 N) D: N6 U- \* ~
}
: U" X0 O  Q( p' R( i
! N* w2 A" c9 o3 |( G& Y% A. C' h6 O- j/ ~: @! ]& k
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* I8 h; D# V9 n( H7 y使用下面代码,对内存使用了mmap函数后:, s7 p; E. I. \& F8 n6 c
#include <stdio.h>
/ o; c4 Z& Z1 C: a+ `' w( E#include <unistd.h>
# C! j0 F1 w6 [7 I! V4 @#include <sys/mman.h>
; e$ \  N1 S8 Z0 k( L! a, b: D( \#include <sys/types.h>
3 K: x2 r6 t) I: O#include <fcntl.h>
4 x" e" w& P( P, M& X9 U6 `6 l4 ]& @
#define SHAER_RAM_BASE_ADDR    (0x80000000)
) U' q" O- C7 E" r' S5 r# @' K4 ^( G#define SHAER_RAM_SIZE         (0x20000)   
1 H3 ]% M  r! k; d" C9 O' I% L, m0 }7 h, ^) r4 r1 C/ m. u9 [; H: l; ?
typedef struct
) l8 {; G9 S2 u/ w) _) i- J{
/ r/ @7 T! k% |& Y+ @* c/ x0 n" c0 L2 O, a        unsigned int a;
1 U! i8 {" g: D* Q1 \& f% L6 H        unsigned int b;
6 F# m8 w; H0 g& f0 Y        unsigned int packet_cout;4 k3 _/ O1 X1 O! y* z! y0 T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 w' ~4 p6 h0 x8 ?; M4 H% k
3 ]8 C' r) h7 T" B5 U- }8 E5 Tvoid read_MSG_buffer(int *baseaddr);! {2 G8 ?' t& q' {! p
unsigned int count_copy = 0;% ~1 L* I  W% W; W  S6 {

" `# [3 X6 S7 X9 eint main()
5 s" A7 p+ G, V/ [5 L* R% `6 T{
4 w& s; m3 ?- y$ d1 M; o* p        int fd;; C7 _' r+ h8 [* Q9 c5 M
        int *mem = NULL;
( o4 @/ f4 \, R; U) i* t% O3 y& _6 [! e
        if((fd = open("/dev/mem", O_RDWR)) <0)
" H" q0 F# O# e1 {7 v$ L9 M- e- q        {* X$ D4 I9 E. v# ?  G3 d
                perror("open error");
; L, C: b5 {- _% k* l                return -1;& v0 j1 k$ ?- M6 X% J. ^# G
        }5 s. J) ^  x6 h, l3 |7 J
        
& b- M, v6 j0 V4 u/ F4 x        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);. s# j1 T/ f/ }
$ w/ k$ `5 B1 c. [/ m/ l) K2 Y6 |6 m7 {
        while(1)' U4 O5 L6 [4 J. a
        {/ l/ C7 ?7 i' v5 S
                read_MSG_buffer(mem);1 U+ Z9 [, |- o& r5 L- t& ?5 o  T
        }                7 t% j$ Y/ E: j) m0 @
}
  g) L# W% c7 _8 g4 \+ l" `' d( Q( j( ~4 ]; N9 w
void read_MSG_buffer(int *baseaddr)) h1 \2 l+ S( w4 \: B( ~
{9 I' X: q% W# G% _8 |
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# z. @) }% G' a5 [: H0 e% k) v- ?$ n/ F: Q3 [
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ ~" J  C7 V4 f. d

% E' u! k4 v! c( X1 H2 N( S, \, w        if(pshreRAM->packet_cout != count_copy)
- f7 g4 H8 `8 K$ P  D        {
4 K9 R6 f9 b8 s7 e, f! A1 V                printf("a is %d\n", pshreRAM->a);8 |. k+ ]" u3 c* N# V% e9 M- h% ]
                printf("b is %d\n", pshreRAM->b);
! c5 H2 N% r; K' e# ^                printf("count is %d\n", pshreRAM->packet_cout);
5 {/ y2 O5 T. M0 l7 j4 g4 \, |                count_copy = pshreRAM->packet_cout;
6 ~7 ]* R. x( }8 E# C9 Q0 s. G        }
, u( X  `( h8 Q$ a# b1 d, S        else4 Y" }4 ^' J  `0 C  `8 J1 L: G. [
        {, {  }$ T) W/ @) s- E' {
                printf("No effective message!\n");
& e* s$ B9 ^# e$ [/ Z! g$ @        }/ S& D. E, F4 L
}, F# r5 g& o( v6 ?

6 K* s  `2 s& ]3 L' e没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 G  y) Z2 v8 }. Z' M, l2 \3 ]
' u2 \# f3 _+ r( w9 M1 e4 h/ ?

, w$ D( b1 L1 J7 N- h% e9 ?6 Z1 F& X+ O$ q9 j! K

2 {8 Z( F" W! a




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