嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- S" W: h5 u3 e% P3 Z& P; h0 K7 D+ v2 a/ B$ @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>4 u* M$ c9 j3 \- E0 ]
#include <unistd.h>
, [% X1 Z! t* V! s. d. o( ~( _3 _#include <sys/mman.h>
2 N) |7 t! y! u# C) I#include <sys/types.h>. b& y% h1 Q5 b  K' g
#include <fcntl.h>
3 W4 o! U& u5 s" h# l5 v6 O, n6 k4 J) M3 R1 a8 ]
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) d/ |! W9 [: L4 I' i0 i9 ^9 D; c8 K
typedef struct
- n. H7 `3 S8 l7 z+ X{: ~1 X+ ~  j* y0 H9 v- Q( f
        unsigned int a;
0 A% a. f4 b0 J% k" U3 x# u" h        unsigned int b;) B) r4 `# t3 t- p+ `
        unsigned int packet_cout;0 h" ^* ?  {  [8 ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: H* Y1 i, V' p
7 l! y7 ^" O6 S6 |$ x+ e9 F4 {void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 j- i1 l. ]- [( |- ?% \
unsigned int count_copy = 0;
2 k' j" @$ {8 L! z% ]
) S' V/ p4 r! h; m" k5 G$ `# f
* b8 ~& {* H+ @8 s. Z4 ]int main()& ^% \0 h5 E' C% j' p# I8 d2 W
{
0 q  s& x5 J( Y2 c4 ~9 X! Y2 L3 S. U        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 r5 [6 o  w% Z- B" ~; u        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" u" d6 P4 n2 d
! q9 o: F8 j$ a* ?# P7 x        while(1)
2 E9 ^7 F) \8 w) g        {
# @7 M, a, }5 \: ^1 X5 X- N                read_MSG_buffer(pshreRAM);7 `1 b+ p2 f# q6 T; c
        }                , c0 i2 M$ a- p4 O- J( D; U
}
0 ?7 R7 }7 L2 p3 n
7 \' V; K' D: Z4 w9 X1 [+ H. @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" l- O/ u- p& I8 |# w1 m
{
/ u# t% V- `$ u        RX_MSG_PROTOCOL buf;
' D6 k" n, G# r        + Q) V/ Z. W3 k1 H
        buf.a = pshreRAM->a;5 H6 _  o, {; ~$ H2 d
        buf.b = pshreRAM->b;; ^% P$ e0 ^0 `( Z4 h3 i8 J
        buf.packet_cout = pshreRAM->packet_cout;
9 V4 {. M6 V9 V        5 {, X" D5 S" h& m
        if(buf.packet_cout != count_copy)
' R5 @* S% M* g; H$ k  B9 X# ]        {
# }( S& W  T) N* Q; o' ?: R2 ~' `                printf("a is %d\n", buf.a);0 q) H% Y* q( g% v* h3 E8 L1 B
                printf("b is %d\n", buf.b);
( y: q" r8 K5 i                printf("count is %d\n", buf.packet_cout);6 K4 M( R9 h( N9 Q
                count_copy = buf.packet_cout;& `& L9 U+ d$ c' M
        }% ~4 ?/ L# i) ^7 ^# i, _
        else( X: |! C0 w- b$ K' [" j$ N7 R1 @
        {! a% U7 q& P$ u$ @7 @+ U
                printf("No effective message!");
' i+ y: e) q) R6 m! S5 X2 T        }
" }# I0 P# J- `! ]/ k}
# d, x8 l: p' a# l/ N( w8 m
1 [5 Z6 D! M$ l2 y- t8 s; ?8 l$ H0 P" x4 i
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 ~5 w% K! q/ x使用下面代码,对内存使用了mmap函数后:* u7 ~8 s" ^2 @1 E5 ~* l9 L3 \
#include <stdio.h>
* \3 i) p% F! K3 F; [4 z#include <unistd.h>. c& L; @- D) U$ g7 M/ Y# _
#include <sys/mman.h>" K$ E0 m' E* v$ t' z) d$ Z* S" A& q
#include <sys/types.h>
/ J* k3 f7 @& Q3 r6 s4 u#include <fcntl.h>
( t/ G% ?; k' n- r$ @
  J% r3 U8 Z$ c1 z; V& M#define SHAER_RAM_BASE_ADDR    (0x80000000)
; a  w& A: l5 E' M/ ^#define SHAER_RAM_SIZE         (0x20000)   ) k' c# Y9 {$ c! d; q6 |

8 x' c; |( L- y4 E- r; u  O. @. F2 htypedef struct
! _' [" y6 g1 x' x3 Q{( ~, P) ?2 R0 R% j
        unsigned int a;  s, @/ K4 k- K
        unsigned int b;
7 g- r" `2 l1 H        unsigned int packet_cout;
) C6 r, Y8 [! A8 v9 r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 }6 k! f! g. v' j7 _
; N, F+ r, P( j8 w
void read_MSG_buffer(int *baseaddr);
5 S" W! J( U/ g2 ]7 A+ munsigned int count_copy = 0;9 M0 X3 X6 M, x' w- n* f! P0 N9 E

3 K4 K" Q3 N8 b' _) \int main()
5 ~( ?4 S: m# ^5 n" f{
! x  W& j4 Q2 }        int fd;8 i/ B% W+ R; j( d
        int *mem = NULL;& R& y4 B+ \1 |# U( S2 E* R7 I
5 m" Y- n# `0 f( ?7 x! ~
        if((fd = open("/dev/mem", O_RDWR)) <0)
8 I& l$ R; v9 f, N) [        {, X1 M; p( X1 r: n" j8 \# y
                perror("open error");+ p5 e: f2 |! |* A8 |' _$ P
                return -1;+ ]3 ^4 a% z7 V) U. W) v; x2 Q$ d
        }; r2 A7 G) t  c+ \3 x* i  s
        / f5 o$ t/ j; S
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 f0 M& k2 i/ r2 {* L9 Z7 C* c1 P4 h# k* F' |
        while(1)
4 y+ k+ S" X* l) b- O1 M4 i        {
' i; v6 t" ^! l+ p2 _  y! E                read_MSG_buffer(mem);
: p8 y2 O* v6 O# ?: a. D' A        }               
/ ^) u" w8 }; v& `/ `( n' Q}4 N9 H; v2 _3 p# q! t2 r3 J+ V0 |

6 |& ?) n* A% p4 D; J, i' L9 S) gvoid read_MSG_buffer(int *baseaddr)' l$ {2 Q- w$ `8 E- |% [- e& b# e
{
# z! p  A* G  f( d+ K* {3 [3 R        pRX_MSG_PROTOCOL pshreRAM = NULL;4 R2 n. f) x& G+ ]! y9 n9 Q

  l0 \" s$ E5 Z" u# a        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;3 Y, z# j- y/ S( p2 R" U
! Y& y4 [( V' t8 K! R9 T
        if(pshreRAM->packet_cout != count_copy). {. H; H5 ~" x. T6 w" w. m
        {" p* j( `. i9 |. T8 @' Y
                printf("a is %d\n", pshreRAM->a);
# R7 `# y  O2 t( T/ q                printf("b is %d\n", pshreRAM->b);
1 _9 J1 a3 I+ B  O$ w( P  a                printf("count is %d\n", pshreRAM->packet_cout);. V8 W# N5 ]' n
                count_copy = pshreRAM->packet_cout;$ z' _, p! I* z  C5 s
        }& r1 ^1 j- I* Y( p& o
        else& ^# f3 I) B6 p- K1 @1 I3 k
        {9 X: c; C+ |+ B+ }' n
                printf("No effective message!\n");2 R+ J( M& ~& T) M: z8 k) @1 n
        }- P# T* p0 X$ a$ P7 M  T
}
) t; J0 h" n& H" W: s
" Q: }; T7 r; I1 V: o  d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! V( W3 k7 Q7 L6 b7 j

, z0 E" x# d! x0 H+ m; s  o! Y
9 u1 L3 }4 m4 P8 Y  j0 f2 t3 A
* R- {- R! q, B" u  @2 z$ Q$ K# w' ~4 B, i% b& B. K" \7 z





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