嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 R$ G- P, M- J( V; m8 Q
  ?* L9 J% @' M4 v2 G3 K1 IOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 n7 q  @7 {) Z  C  [. K2 [
#include <unistd.h>
7 o9 s, w$ C7 n+ p9 Q: ?#include <sys/mman.h>- c" C; r. w8 c/ [0 R! {! [' D  N
#include <sys/types.h>) n7 O  J) M. Y# F5 {0 x
#include <fcntl.h>
( Y- U# Z( V9 i" i( [+ H. M- h1 e6 c" d
#define SHAER_RAM_BASE_ADDR    (0x80000000)   0 o+ [9 ~6 n* O' u% W* ]

* t6 G5 L) R/ ytypedef struct$ X* X$ s+ T( w2 ~3 d
{
+ `! N7 f* |1 q( |/ H        unsigned int a;
2 i) m; F# s% d# L/ ]/ s        unsigned int b;- ^$ }" g$ W" B1 J
        unsigned int packet_cout;+ {; J, R; P) j6 N0 q* Y  i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 C- B0 f1 H0 y& |
2 M6 U( Y& b) t" E( Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& {, c9 N$ I. t+ U8 n( U
unsigned int count_copy = 0;
- d$ X" _8 b- G& c4 L9 L+ f3 ]' t5 Q5 T) Y" V+ w
' F' U0 F0 O/ q1 O& Y4 {
int main()
5 e+ N0 ?& @- n{0 p0 }3 ^6 `2 A9 F1 B
        pRX_MSG_PROTOCOL pshreRAM = NULL;5 {. H5 G1 A2 j0 I
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 H1 D$ B* K2 n1 J! J5 O/ v: k  c% q2 p% l! Z7 h, T
        while(1)
! x9 C; w; b  O        {' S/ m+ e; {$ w# ?2 w9 t0 ]
                read_MSG_buffer(pshreRAM);
/ m  p* o6 U( _" P2 x  I% {9 G' x2 M6 T        }                ; N4 w$ M" g1 G+ u2 f: W
}+ o2 y# y2 W! U

+ p% q6 D" h9 B% _" E" Y+ pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( {% p6 q) b2 U* }# }  ~9 A{9 W/ a, `, E( ]6 [2 Q  T0 S- P. H
        RX_MSG_PROTOCOL buf;5 D0 `" u  J) v8 D; a: i
        / T3 U( h2 }. l; e. @
        buf.a = pshreRAM->a;! ~6 @7 @* n7 {9 \* Y- e, l
        buf.b = pshreRAM->b;( x3 U) Z$ c5 e$ V2 j; d
        buf.packet_cout = pshreRAM->packet_cout;: X% Y$ i1 o- H  y- x
        ; p0 \4 o! {  k) H6 f
        if(buf.packet_cout != count_copy)
9 T- f! z$ k+ E        {7 J# v" Q0 i+ f/ x
                printf("a is %d\n", buf.a);! D' m* b2 z+ K
                printf("b is %d\n", buf.b);' U! g# d* z0 J! V
                printf("count is %d\n", buf.packet_cout);
% X9 H# z% \- T; s& _0 r                count_copy = buf.packet_cout;
5 e6 @5 \3 ?+ q5 V, f" j        }  [- q: ?9 e) N# F) E" D/ E
        else
. p( s4 A! x- X. \        {- X7 c+ n- k: O) Z0 w: w4 j- l
                printf("No effective message!");
0 e( X, E- C/ `9 \3 M4 O8 U! a" y+ Q/ s        }
7 Q0 U2 i. a5 L3 P. \; A* g, w}. j  b2 _& d4 h# o" O6 R0 }( Q

2 y2 c( m4 ^& ]8 i( y
  u* @! `  `; M7 L& q但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" r( s! d7 W3 Z. s; q+ U9 {使用下面代码,对内存使用了mmap函数后:
% Z, w6 [" ~2 \8 ?, \: |#include <stdio.h>
: C8 l7 W7 J2 v% J#include <unistd.h>& v  S, |3 ?/ s* m9 h" s% a
#include <sys/mman.h>
- u! ]8 _8 |! a7 m! n4 O: J; f#include <sys/types.h>
( |( s  F9 D  Z7 m5 J#include <fcntl.h>
6 M7 Y% C6 R3 v5 y. W
: d+ M' @- ~/ o1 A% U9 h3 ^$ p: J#define SHAER_RAM_BASE_ADDR    (0x80000000)
6 v/ \" U9 K( J/ C* T; T#define SHAER_RAM_SIZE         (0x20000)   
& s( M* w5 }& d
! ~' i  F& s* b( |% d1 \typedef struct
8 a/ j: _/ z6 G/ c{
) h2 I1 Q7 C3 i- }; X- V. B        unsigned int a;0 s, l) K% Z  q. t
        unsigned int b;+ ^: t# W; S: z* Q. {5 u) I
        unsigned int packet_cout;9 x0 u2 f# y7 Y$ M, J% U  B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ K) |0 \2 i* D& P! q  \) `

6 W0 F* b- G- z2 Fvoid read_MSG_buffer(int *baseaddr);) B5 n! j  t% a) Z6 d
unsigned int count_copy = 0;
" w4 P- z% E5 S6 R- A6 ^- z1 J: @: r3 Y+ ?0 @1 [
int main()
4 T6 K& ?9 z8 J8 `( ]{
/ v' W* T' h# ?# H/ q1 u5 G1 n        int fd;; A% W& m0 S( ~. G2 p
        int *mem = NULL;
6 G- }5 `  G5 \; k/ h5 b+ i+ d/ j  t  T/ c; O
        if((fd = open("/dev/mem", O_RDWR)) <0)5 ^5 l0 i. h) g, ~2 _
        {9 R! h9 q  R/ W2 F; d: Q
                perror("open error");) u" z/ m6 \$ K
                return -1;. L! ~( R1 V- u  N9 W- e3 G
        }
$ Q9 `" f: P& v        8 e- T( Z6 k9 M( G! n
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* ?, d/ p! ^( s& i# C, X
, U! h5 M1 K3 V  I
        while(1)
8 \" W1 B' [* H$ H) ~3 e4 [        {2 @4 `# S" \: L5 e$ f8 p. n$ s
                read_MSG_buffer(mem);0 Z  A) G7 T+ ?2 u& c
        }                0 C- v+ u+ ]+ `
}
5 u0 W& s/ G( }6 r+ A9 E+ w. Z; e& k6 L- x: D
void read_MSG_buffer(int *baseaddr)# k8 ?( I6 e% E5 P! T+ `8 x/ H
{
- N1 O7 E9 s+ r; I8 p% C8 g7 {        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ f; C/ e0 {3 Q' l3 c" L
! P. @# ~+ |7 Q7 R% p) D        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% u) g9 V* b5 w0 e2 N: l4 j" P. h  k7 L% z, |3 i% a! ?) C
        if(pshreRAM->packet_cout != count_copy)" K0 S! i% y0 ?) j! n) Q& G
        {
! I- B# p8 _1 @  @+ b                printf("a is %d\n", pshreRAM->a);
9 c) X* f  Z5 u                printf("b is %d\n", pshreRAM->b);
1 K# P+ ?: F0 y7 a                printf("count is %d\n", pshreRAM->packet_cout);
, E& R- S3 n& Z  `% V                count_copy = pshreRAM->packet_cout;0 ]5 Q, W/ M! a+ P2 @8 f, S: u
        }; @. M( ^( @6 t! {
        else
0 Z, R% e! V8 z1 w( g        {
0 n# r8 ?( t' g' d# g5 o                printf("No effective message!\n");* e3 g6 K5 Z, z5 t  t' J1 S
        }
! R1 s+ U/ u% q) V}- n/ I/ n! t: J: P

: P" e, M6 z& E* \* ]没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 E* {) S: |$ E' R8 S8 F8 f$ \* K( ?' j

. X. w- N; A7 c" U# \: A/ K. e; o% D

* Y  p) e. q) v. R; ]' @




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