嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 s+ |* i( L* Y" z% t% @4 G& P' B( l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ p) E2 J$ H( E! Q#include <unistd.h>5 u0 |7 J7 V7 t- {1 ~2 |
#include <sys/mman.h>- A/ g% n/ m- k9 I
#include <sys/types.h>
0 d( A' f5 O0 K2 ^* }#include <fcntl.h>
& c/ f. P1 [* [) }. b% _% y8 y- f8 l6 a
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! U6 V3 f8 y0 V4 @0 H
# j6 C* M+ q& Q) U' G
typedef struct
! k4 P* ?7 S( L  {! r8 i{
* X7 n. j4 s6 D" X! f) Z        unsigned int a;/ i5 v) ?, J' T7 z' n7 d/ ~$ g) Z/ D; t
        unsigned int b;, O8 m6 z9 @. h* b/ B$ t- @
        unsigned int packet_cout;; z: w5 g$ J! ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' b! d" N: Y: p9 G# k% T1 Y) k7 L" U5 |1 k! h1 G/ P: r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ {# h( I6 N' ~) ~" Uunsigned int count_copy = 0;
  x/ C, v: Z/ {/ v( l5 a' G* ^* P3 W, m% _% b7 Y

, d% @( C* _- [5 U" @1 ~int main()5 U$ `) V3 u8 E- o& {
{
2 Q3 e0 Q; |, m$ {1 j. n        pRX_MSG_PROTOCOL pshreRAM = NULL;  O7 o7 {" _& ]
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, c5 I4 l1 @- x$ g/ Z% v
8 w, h# K4 B9 `0 I" d5 w        while(1): o5 C  V& ]2 A5 M) U
        {  R' \- ^2 F8 I/ T0 {8 e- Y. U! E1 n
                read_MSG_buffer(pshreRAM);; C3 _8 v" E) i" X
        }                0 l( N% n4 K5 M( X" A+ ~* Y- A
}
. I% {3 {) p' d  x" h9 M! Y* h5 Y# {4 \6 s. C8 h0 [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( s$ E$ M% a) d/ f
{* |8 ^7 ^0 t, T
        RX_MSG_PROTOCOL buf;. H% Y" a' _8 _. {
        & Y6 M9 D/ f6 q+ Y) t
        buf.a = pshreRAM->a;
8 G- f+ g& b  O5 ]- L2 h        buf.b = pshreRAM->b;
+ f2 G' P! }8 C7 \/ R* n$ B: R        buf.packet_cout = pshreRAM->packet_cout;* o0 Q: A7 h/ `. k/ k' o. b
        
: `1 F1 z) W( o        if(buf.packet_cout != count_copy)
+ w* m5 Z1 z( \/ L        {
' t7 o- r4 j; y0 y& n5 Y* t                printf("a is %d\n", buf.a);# Y0 `$ P6 ?1 V3 ~* E( W  x, f- s& W/ b
                printf("b is %d\n", buf.b);! g7 [7 w* H! ^5 d; v
                printf("count is %d\n", buf.packet_cout);6 m- Y* j; A% @# K! S! p
                count_copy = buf.packet_cout;
! Y$ G4 C2 e& }2 i! u- E' R        }7 h8 B7 ]( O  ^- l8 u- {
        else+ }2 k9 A# E# U+ w; n
        {& I$ L$ u( }9 R
                printf("No effective message!");
4 I& \& [* ]1 a7 F5 p        }8 A* w8 g& r5 k, {. i5 w) z
}
0 z8 r1 x6 t7 L9 G7 E" f* [6 o0 C  r) _. G
5 \$ b1 `1 h3 ?
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( y* p, Z" ]2 B5 A6 a3 I! ^( x使用下面代码,对内存使用了mmap函数后:
0 l/ O1 _( v1 Y+ r% N2 m#include <stdio.h>; |/ B" k$ }- B
#include <unistd.h>6 b, l) D) B3 c
#include <sys/mman.h>
0 z) B/ r# V4 W#include <sys/types.h>+ t, T1 H  T8 k- I
#include <fcntl.h>& I8 {3 J. u  u0 H+ Y, q

" [+ ~; l4 {$ C$ f: v; \#define SHAER_RAM_BASE_ADDR    (0x80000000)6 g0 \$ l4 p% l- m/ @
#define SHAER_RAM_SIZE         (0x20000)   
7 w! \+ S5 b3 a+ ?; f$ |
+ L( \. J; R$ `0 ?* ~typedef struct
: {! S( X( C7 I2 [2 T/ |, U{; e. j, e* R; N, F! k+ s
        unsigned int a;
! @7 r1 Q" A7 f: G  J( t  M& [" @* u- h        unsigned int b;
0 a5 q0 D( ~2 F8 r. X8 H- c        unsigned int packet_cout;
9 ]9 T, [" F$ m' _+ k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 B2 Z- j0 D2 W3 s1 S! p
  l! f/ `- C! v# Y1 H7 g& S- w4 P1 [void read_MSG_buffer(int *baseaddr);
' `* v: n1 D* g0 `+ Gunsigned int count_copy = 0;* k! e$ n0 @; s6 _

5 U) J5 a* d9 c! _- aint main()
+ h4 K2 T9 e. k$ @+ W{: `( |  g) t0 B) n: a
        int fd;( S7 G& h6 F0 ]+ ~. ?
        int *mem = NULL;" O! o' H( `) V* {) T: V

  B0 w( ^) J7 Y& U- ^- E        if((fd = open("/dev/mem", O_RDWR)) <0)/ |0 V; n5 N8 o1 a
        {  x. {$ h, F. E' n2 _$ M& T
                perror("open error");8 a' D# k& ~5 v  t( R$ ?2 I, o
                return -1;
. e( Y5 G  `: _' D8 b: e" @: ]- p+ y7 ~        }* q( y$ j; X5 Y0 ?  ?
        ; L% _8 t, W+ O- P% Q% H: Y
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; i$ F# z: G: b; s
5 ~0 U: o" A( F5 e$ x5 D: p. k
        while(1)( x# O7 y" F' K( W' \
        {
1 K& g" f4 ~6 R" l5 X  E                read_MSG_buffer(mem);
2 R6 y. ?) [. F+ V! \, ~6 Z        }                6 |! t( |9 `) D' r" a+ _) }
}
! d+ [( c+ D8 x: C1 |, o, P$ S- J  e, s
void read_MSG_buffer(int *baseaddr)) M: O% e8 t! x, P+ q
{  D7 g, G5 z( c, K
        pRX_MSG_PROTOCOL pshreRAM = NULL;
* c5 T2 L- s9 k, o5 u6 N
% e! T# R& E: H* }  J, ?' g        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! g/ _, E  |& g
" D8 v( E2 [; t7 v( ~. J$ D
        if(pshreRAM->packet_cout != count_copy)
0 M1 ~/ h% a" ~) Y% u- ]! ?# ^" c8 D        {
4 L7 _6 Q+ ^+ u8 h                printf("a is %d\n", pshreRAM->a);6 B3 x% G* e) e
                printf("b is %d\n", pshreRAM->b);
: ^& N" F: p7 I                printf("count is %d\n", pshreRAM->packet_cout);
: F" H7 _, p+ x% {: a/ u8 a0 q                count_copy = pshreRAM->packet_cout;
1 p2 W: J: O6 x2 u8 K: Y7 B        }4 E! F4 C' c: `* S1 p
        else. Y; u. q' X% f5 Q* q/ o
        {2 [& V9 W% p1 M  ~' y
                printf("No effective message!\n");- M* ^4 d4 ~7 f$ H+ S
        }; g0 l! u2 O* v5 W) D# y+ d
}# b# y/ s0 ^# F' ?# \
9 m2 |! Z1 |$ y& S' w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& V9 `0 I# [/ G5 Z+ r" P1 P" I& w" O" A* C& ]
- P/ }. X' v& i: i' t2 j, d" ?& m
+ `+ V6 F4 n/ {+ b$ H5 t

8 ^' S/ W' y. e' K




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