嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! ], D3 E- v% i+ ]
+ z: y" o- u# ]  S* mOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>3 _3 P  J) e" M" _' P
#include <unistd.h>+ J1 @9 d, b4 B+ u2 p4 `
#include <sys/mman.h>" h3 t5 A: o# c7 M/ g+ N
#include <sys/types.h>* y& _( A9 S7 Q
#include <fcntl.h>, g, S3 ~: F# j0 n5 a( ?

2 r/ A+ ?# ^1 E#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) c/ x/ P7 y( v- H+ E7 l' X

- h0 }! J& u. |+ Itypedef struct- o. A. j) s  _9 y1 ]) j/ L5 u
{( k; H) W! A/ _7 ~+ S" o2 a
        unsigned int a;
0 _! E% y, ^' J0 ]+ X8 |, u8 U        unsigned int b;
* A# w" j$ G+ I( ~0 _        unsigned int packet_cout;9 B- V: l/ P+ j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 D% P4 P$ I% s% Z! v  A! c1 q% }- z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 H, h7 y$ x- P- V. O2 m% q3 D0 H% Uunsigned int count_copy = 0;- j: o3 U# N: p6 @+ U
4 i. M/ H. O& u! W6 S
: l5 H8 o5 n" A0 ^
int main()
- {0 P6 H/ _. E$ o/ ]& T; f{
# i& E1 [4 q& z. B" J        pRX_MSG_PROTOCOL pshreRAM = NULL;
# E& F2 B- |8 c$ E* g/ z8 G        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ Z+ k" s" k9 b" w" D5 w5 z
6 E* I; v+ N  L' y7 Z& C3 b' {- ~
        while(1)
4 P0 V% c" Z- ]$ l5 H( w        {$ i* |/ w! r4 l. f& u7 d+ W( _
                read_MSG_buffer(pshreRAM);
) t8 x4 o( G: l        }               
! J2 H; T3 @! i) x}
$ e) I! e& W) b$ d; [6 \( ^8 I
" }4 K& N+ U. @- ^/ `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); T" g) o$ X6 v" {6 \) L( @1 s
{
. W, u, Z0 k# h  A        RX_MSG_PROTOCOL buf;8 e5 y( x5 n7 d, _# K
        1 r7 c* ?9 Q. S8 Z3 ]* U- k
        buf.a = pshreRAM->a;
3 r/ f$ ]1 c% @1 Y9 t7 V        buf.b = pshreRAM->b;
# d3 ?0 k1 x* w- Z  K4 H6 T8 U        buf.packet_cout = pshreRAM->packet_cout;
8 U# J% d/ B8 d3 E. T4 J        ) c. r4 C/ E7 K0 Y9 ]
        if(buf.packet_cout != count_copy)
$ d9 X0 r* B# u& b+ u        {" p0 y( G; z( j# G; ?0 [* g- I
                printf("a is %d\n", buf.a);
$ g  \/ m4 A' W$ m, n. X2 k7 O. I! N                printf("b is %d\n", buf.b);- t: c1 n+ D+ F0 V8 t. t* A
                printf("count is %d\n", buf.packet_cout);& v+ s2 L2 B4 j. S6 z, N7 x5 D
                count_copy = buf.packet_cout;
( u8 Q& k0 r. C  j        }* @/ W0 l: }$ T" Y/ ^) [
        else* `) F9 }0 ?2 F/ I+ ^% _" g7 {
        {" h! i: p/ j# @3 H+ |4 p
                printf("No effective message!");
( J; y% A. s$ m$ {  @2 d# l5 U        }
) [4 J" H3 G  J% S& ]; Z}
4 X" P, |5 [/ r" N
5 R% V: ?" l9 V, W, s. @5 [
0 P) k" y" ^4 `1 `7 E, s但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( ^7 d) w( l. Q0 ?6 z; e' q: ^
使用下面代码,对内存使用了mmap函数后:* w' P% m; `3 n& x- K
#include <stdio.h>4 n' U6 N6 C, T5 s5 D6 H7 M7 t
#include <unistd.h>: z0 k) q1 N$ U7 \4 b' _
#include <sys/mman.h>; n1 u, T$ C3 [3 g8 R
#include <sys/types.h>( Y: C# }7 V1 o$ [9 C. H* t
#include <fcntl.h>
$ B8 M/ e/ v% |
! ?/ m0 s% o) K$ T0 k#define SHAER_RAM_BASE_ADDR    (0x80000000)
+ J6 [. ~( u5 c1 {* S, k#define SHAER_RAM_SIZE         (0x20000)   $ Q/ p2 r" L" `( y" |

& C" C6 w: B7 Mtypedef struct4 ?1 ]. l0 Q! l, H4 A; R: x; e
{/ n; f) G" \2 g+ I5 p* R
        unsigned int a;
) j# H4 S8 v# u5 {        unsigned int b;) O* u% |3 p. _7 D' k5 d
        unsigned int packet_cout;
% C* T$ A# t% A7 i- y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 y7 f  X. o# E7 q3 G; s
. |$ V. [. I' Y: s2 e2 [5 ~
void read_MSG_buffer(int *baseaddr);# H* T4 E% a: t4 N' d! v1 a
unsigned int count_copy = 0;
5 Q+ p. w5 g% J* h7 F4 ?
1 h; J. K. y! ]$ A  j6 t* w# T( Y# ]int main()
+ y9 ?! I; R# m5 x- ~3 k{
0 x) I, I7 E, [2 A        int fd;# L' u: z3 }/ u  t- P
        int *mem = NULL;
5 R) r, E. l7 K7 a: m# u  U( m3 D/ ^4 I: I1 z
        if((fd = open("/dev/mem", O_RDWR)) <0), b; u  ]; `5 m/ T/ @  s5 W
        {
- [+ D& R2 s5 r3 M0 Q; ]                perror("open error");, s: |9 ~$ k! `# L: R. T
                return -1;! l' z$ u# k$ _4 X- x
        }$ f5 P0 A& y8 L4 {
        
. {# ?6 x1 B. u2 i3 ^+ t        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! K3 N; X2 h* ^% u

# O0 a0 o, D5 V        while(1)
$ z- M2 L* c& p        {! q. u6 W& B+ r. S$ j' k" _. @
                read_MSG_buffer(mem);' ?6 z( ?  T2 d. J& O2 r' T. R
        }                , `, p# v+ w3 k" p7 ^, I
}
% B, D! ~* S- l. m. K# g0 d3 q' s2 O5 S7 v6 t" b
void read_MSG_buffer(int *baseaddr)' F9 p# d5 c( S1 d/ {, Y; I* W& A* I) Z
{0 V" z) m1 }- z" Q
        pRX_MSG_PROTOCOL pshreRAM = NULL;+ S; a2 f8 j3 c6 j9 k

' O3 K; ?! f: S1 G  J2 N        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 m  U/ p5 D" c* Z& {8 L
+ I; ]: s: P8 H/ J5 H
        if(pshreRAM->packet_cout != count_copy)& }& \* A- H' m+ a0 r# j: B
        {
; e8 c* Z" c* W$ D  o$ w                printf("a is %d\n", pshreRAM->a);
4 ~: G9 _3 {% @) C) Q3 Y. g                printf("b is %d\n", pshreRAM->b);
3 z' x) m, d5 A* p) r& t                printf("count is %d\n", pshreRAM->packet_cout);
) V, p5 A" `6 _* z                count_copy = pshreRAM->packet_cout;
! r6 M: y7 r- I3 e- C5 B        }
1 N" y8 ?# V* n# U        else
! V& S. A* T/ e7 L        {2 `; e/ R1 ]" s; t  g
                printf("No effective message!\n");/ ^) H/ L& X! n/ c* j5 ]9 E! Y
        }' S; D4 V- N2 G" g9 T. o
}3 K0 y4 e$ T0 D- Z2 U" K' f) M
0 y" H6 n0 {8 d* b' Q# R- H" o
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 s* [" x  _8 A
+ `5 a. R1 S3 C3 ~$ O* L9 ?
! S4 Z2 F* T2 C: s1 @- B; E' f/ u2 z$ A) [! f5 A; Q# N+ V0 d

/ k0 [7 m4 ~: L, W8 a# I5 h+ ~




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