嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* z% w) c! O: D* Z0 b/ F+ @+ W3 G5 q* d4 C# {
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% S1 {" a. O- L, o8 z3 S#include <unistd.h>
! L6 c8 P2 o' L: C! E  i) S#include <sys/mman.h>
* Q& ^8 w# I5 w' \: P+ S3 q#include <sys/types.h>
5 [2 I  ^% U% A8 ?, a& p7 E& _9 V9 V#include <fcntl.h>' L) N+ N+ f" M$ H* d

8 [+ Z$ |9 g2 O5 p+ P5 B#define SHAER_RAM_BASE_ADDR    (0x80000000)   0 P( G( R& g. E& e# p

! g! c* E+ q! X5 ?* Atypedef struct
7 M- |* K7 Z* H{6 ^  a, F8 K; v) ~9 `' m
        unsigned int a;% v, g/ `8 T3 J8 O& ]9 K
        unsigned int b;. |% k0 Q1 z8 K8 [% P4 ]7 i+ `
        unsigned int packet_cout;6 v0 R, \- {% k" A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ h. t6 [& @; U' y

8 t2 e3 E  V8 _! Yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 h1 V7 K9 U# s: W2 iunsigned int count_copy = 0;
5 J" ?0 v% A+ O% ^# |
, _) h- O8 S1 l- g$ s4 K' Q) M
4 w5 A& H( p' T" T3 h5 u; bint main()1 k7 d7 H% M1 ~' x" \* |$ F
{4 a$ n2 X" ^, \' R! _
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  r: P2 y5 E; I        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 i+ D/ d2 E4 u' i) X3 R# P
& T! P8 X+ f# _3 d. |' O, I! d4 l        while(1)
$ W, c% E% a# Y: P: G) x; n, r( S        {6 n  g: _4 e2 l  \, V
                read_MSG_buffer(pshreRAM);1 G1 c7 o( h& O4 U
        }               
3 l! l, v+ T. Y/ G}8 u: [5 W2 B* A5 A/ D0 H% {8 K/ O
1 c9 a3 J5 S2 {$ r" ?9 d+ y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 D% |# e; C7 I/ L3 Y0 T
{
: R2 ]+ E" f( f) |        RX_MSG_PROTOCOL buf;
( S* J" P" x& h/ e        1 C, q+ W( y! N3 t$ X7 a
        buf.a = pshreRAM->a;3 x6 U7 t  ~; i
        buf.b = pshreRAM->b;& I/ V9 U: S6 X8 Y
        buf.packet_cout = pshreRAM->packet_cout;
( S& W) Z- j% G: d) U        % [4 ?* A2 Q" R9 v" v- o
        if(buf.packet_cout != count_copy)- h: n9 P7 a4 \% _: h5 d7 _; u' }# E
        {
1 R3 K" Y$ s& D+ I1 N, o( }                printf("a is %d\n", buf.a);
  f8 J7 c4 Y- F                printf("b is %d\n", buf.b);3 M4 l1 p. d' x0 Z, z% c
                printf("count is %d\n", buf.packet_cout);
0 ^( M1 c& O. Q! j* G& `                count_copy = buf.packet_cout;
+ ?8 k- v/ D* @1 {9 i        }
8 Z$ ~  H  o, \, [& @/ A( X        else: Q! w& u+ I- U9 `
        {; ^6 x, M% ]& ]  o1 _- u9 P' H
                printf("No effective message!");
# b+ S' d* g) |: `$ e6 E        }
8 S! A( o! z) R6 ]' l( g}
  G  c( s8 P% d$ {- ^# n$ ?7 z) x$ a

5 p& [" ^. ]9 |. Q; j' }但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* l) z  B5 I* [+ a. f8 a使用下面代码,对内存使用了mmap函数后:1 }: y! y, V( ~& ]+ F. u9 [
#include <stdio.h>1 t2 S3 y" m/ p) m
#include <unistd.h>
2 T5 P9 M0 k9 D) w#include <sys/mman.h>
$ z; ^% S' B+ r6 K3 s& S#include <sys/types.h>$ l0 {# y6 {! C2 z. @
#include <fcntl.h>) A5 d: C8 w* x- _

  T. F) O% D6 P1 t#define SHAER_RAM_BASE_ADDR    (0x80000000)2 a' j7 N. E7 K
#define SHAER_RAM_SIZE         (0x20000)   
6 c" q5 V, c( t/ r
. z" G2 i! L( M8 |' ctypedef struct
2 U0 J/ B+ b% q{; b/ e) Q; I* |% o3 I, S, s
        unsigned int a;
6 C7 ]8 f  [0 f5 p$ d- W        unsigned int b;" a. O1 N$ o, K/ [" f) ?
        unsigned int packet_cout;: Y7 a8 h2 f( b) x! V: t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 C; x1 L) q/ U
- h4 S' ^9 Z$ W. \; T
void read_MSG_buffer(int *baseaddr);
7 z6 O9 R/ t4 N3 W7 Bunsigned int count_copy = 0;
7 X+ M8 o0 a6 @; c' |/ D7 R8 y" x% U4 `" I0 Q# E) T. W( j
int main()
# z* x! L1 P# J3 y! J- y& K{
! W0 x* Y  p  o- X5 A        int fd;
  |! b( f2 d( X( L# C        int *mem = NULL;/ T" g: q6 `0 D# j6 o2 M; e- x0 p

  ~6 v1 i8 e! t6 {3 z% ^        if((fd = open("/dev/mem", O_RDWR)) <0)9 c5 O7 u- B( _  e
        {
4 t' r8 S+ t. A! K$ |) |  P- u                perror("open error");
# ?* N: \$ J# j3 p# e  v                return -1;9 B( G! u8 I& u- \! L' [; u2 M
        }5 L2 C6 E& O7 `0 ]+ R0 T
        6 i8 i. Q( `. Z- q
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) v+ v3 u7 Y- ]; F- \6 O# ^- k
2 A8 T% M; J9 `- H        while(1)1 ?' b! h! }& n7 K' a$ F! E4 n
        {, x: x5 i; k, C& }0 H7 k
                read_MSG_buffer(mem);
- L2 b$ K% r3 A/ B! ^7 ^  O( n        }                1 Z  \1 `. q% H# o& _
}+ ^% F7 C* |. ]0 c

5 U; h  T9 F9 N7 A- k6 R& ~, Zvoid read_MSG_buffer(int *baseaddr)! E/ D) m" P, t8 B% l
{6 ~) l( ?1 q% @9 q- }; Z
        pRX_MSG_PROTOCOL pshreRAM = NULL;5 g! a8 s6 [% J" W1 M0 [& h7 W" l9 @

. O  p2 n& B3 z( ]- H: Y4 ]        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 L* z, O% P5 k4 y, m* x+ [3 l- U. `. w5 v: S
        if(pshreRAM->packet_cout != count_copy)
/ @9 q6 Z1 E! p        {0 B( v: {4 y( E
                printf("a is %d\n", pshreRAM->a);
  S# W" T4 e. H  h1 O! R                printf("b is %d\n", pshreRAM->b);
/ M. f; w5 A# T" F5 n                printf("count is %d\n", pshreRAM->packet_cout);, f+ q2 u9 x  n/ ]) B1 h; K+ J
                count_copy = pshreRAM->packet_cout;
  }" Q) o# ]6 m+ P/ h        }
1 u" [+ e+ Q& Y$ m7 n: ?) s3 m" U        else( Y: t( ]* e- i; Q9 ?) }! T( s
        {
6 p2 F0 b- z4 s: j9 L                printf("No effective message!\n");3 M  s2 y7 H0 g+ c- h# T3 v
        }7 e, r7 [  @/ O2 F
}5 w4 t* V6 h- z" F' B- X
/ A- M4 u  u% g6 b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 {6 h$ J. ?. r# l/ C0 e) Q
8 L& ^9 F$ O! m/ F# S0 g8 V) j

. X  @& D+ p7 A4 h: J
( W, z+ F& U# \: d. s" W5 q
2 y* ~6 g4 J) |- y




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