嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 a6 a: j  j0 a% y; @& Y
9 V: i, q  [0 O* d6 x6 A- C: h1 s
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 @0 e; n; P9 F
#include <unistd.h>( ?4 G, L3 t: q2 S
#include <sys/mman.h>2 ~. T( o) E  ]* @7 t- F1 R( k1 u2 p
#include <sys/types.h>
, `4 W; o$ Z# \6 b#include <fcntl.h>1 ?9 }0 a$ R% l4 e2 Z; V0 [; G

! W  A9 t; H; u2 ~#define SHAER_RAM_BASE_ADDR    (0x80000000)   * W7 I7 {% G! X7 j+ Z4 w7 O
% X1 K% R/ a# q, R4 P3 p
typedef struct
+ i. k6 n& H5 M% Q# Q8 B{
  X$ a! I; d# i/ }+ [! Z        unsigned int a;
( ]* D% q2 q; V# ?. }. y        unsigned int b;
- ~; P+ y$ C( x. _9 v        unsigned int packet_cout;
/ w. d; l* I7 S% W7 _4 e& Y! l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ N% j5 s! M" o4 C; x6 V% D$ K
9 x5 W# e! m. M2 m4 P3 Y0 u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( p. v9 G2 O9 a6 uunsigned int count_copy = 0;
- ^: F. `; {5 x/ v$ U9 V7 C3 u$ I( n; e
5 |  w, `5 Q9 Z$ ~
int main()
4 {3 ~1 i3 v9 b. G( L{
2 {1 d( D4 h$ h$ w$ I. {        pRX_MSG_PROTOCOL pshreRAM = NULL;
: `+ i5 R: M2 i' c# O, p( T        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ g6 n# p- [, e  m! ?) s' l% J4 D' {' I7 H$ S7 p/ E  t
        while(1)7 R/ p& S2 U& @5 u8 x
        {
6 _. F" K! f/ w/ ]                read_MSG_buffer(pshreRAM);
4 O# i8 G& E0 s/ y8 Y4 `        }                - U0 Y5 F  |% m, J  V
}9 R6 H! S8 r$ m2 D6 m# n
/ I. {9 _' n4 x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 |% {) ~  M( Y/ z; _
{; k4 d5 y. s- C" f( u
        RX_MSG_PROTOCOL buf;" f9 {+ q5 c  W0 V
        ; y& n8 d6 U+ L7 _& [
        buf.a = pshreRAM->a;
$ ]0 _0 _% C9 R7 S+ K( r9 Z        buf.b = pshreRAM->b;2 S" v% n; ~4 k' q6 a
        buf.packet_cout = pshreRAM->packet_cout;
! o, V# a( J9 D# f6 d        2 v8 [- Y1 M' n, x1 f
        if(buf.packet_cout != count_copy)
$ f, }. o- A$ M8 o1 Z0 P        {
8 \. y( r2 j9 ~/ v/ v9 X                printf("a is %d\n", buf.a);
% ?) r4 d7 E9 u# i/ {1 d                printf("b is %d\n", buf.b);3 x& p9 Q0 G. g9 }7 ~' ~
                printf("count is %d\n", buf.packet_cout);! z; j  T& D% _' b0 h9 O3 M
                count_copy = buf.packet_cout;! p  J, N$ _+ @. a+ D$ O
        }2 `) e+ H. S! V! L# B7 _
        else2 K; [0 `# {: J& g
        {
" X5 a  T1 O" Q3 `1 S% P! M% Q, p                printf("No effective message!");/ o4 g7 I' n$ I+ o
        }, k- r4 N3 C9 T0 R$ p# _
}
' }& X+ P# V$ h/ L& d2 _
! ?8 S* t8 N. y. V% r  G6 V
3 E; \$ k+ @9 X但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 O. ~, a" E$ z' w5 ]% B使用下面代码,对内存使用了mmap函数后:
$ _* D1 b$ ]  @. q- r# G#include <stdio.h>
# V$ o1 @3 Q" v- P, s#include <unistd.h>- w6 c" a+ B& O& G  |: w8 l4 k2 s
#include <sys/mman.h>
/ g) P/ p/ a' p5 F* x; E1 T7 }#include <sys/types.h>$ A8 J, U8 l# k/ U9 r8 w4 C2 R! q
#include <fcntl.h>
2 y- Q  N. `* f) n! @' g4 N6 z/ A3 f' d
#define SHAER_RAM_BASE_ADDR    (0x80000000)
9 K* ]9 o; d  P' a#define SHAER_RAM_SIZE         (0x20000)   # ^0 U: q* e. r' e

4 v( g  n, ~$ g8 \typedef struct3 E- J4 o: ~9 d1 }6 d
{
$ M4 z: H9 P+ L8 J+ L        unsigned int a;+ s6 i; b8 ]8 z4 r. w0 i5 G
        unsigned int b;
2 O7 b3 f1 U. d3 O1 }        unsigned int packet_cout;
, i9 F: H+ s# e( @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' M0 H) @5 j& k3 ]
* a7 _: {, |( ?& ^
void read_MSG_buffer(int *baseaddr);
) Y  u' r+ G7 E1 Y" vunsigned int count_copy = 0;& c! `' |4 d) K" ~( Z9 @+ @/ H
) Z2 u+ F3 |6 n( d- R( w$ H3 g
int main()5 s% b  `* u% c% s6 v7 v
{
- k$ q: I( }  J: I& h) ?- m0 {! Y% `        int fd;, E/ `1 m) Z. p5 `. i
        int *mem = NULL;
4 g: u) Y, q+ ]+ d3 e8 _
' C$ n6 M3 H  L; _        if((fd = open("/dev/mem", O_RDWR)) <0)
& C! Y1 x& g" f: g        {* r. O- A. n4 J. @& e+ C
                perror("open error");
$ D& A- t% r5 b) q                return -1;
% f4 @5 g4 }- j* f' l        }/ S# ^' ?6 _& b* o, j  Q2 U9 |
        , ^8 K; t* G$ c; s+ m1 U4 c9 L% ~
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: E- T0 X" \0 h: \
8 I- S( @5 T7 r% G) w
        while(1): D6 U) v+ [& d: w0 ^; c9 h
        {
- k& T# T# A7 j+ ]  M/ N                read_MSG_buffer(mem);
7 K/ t. M* H, Q        }               
9 ^. ~# M$ M+ g9 W2 l}
& y5 c, @7 c" j, \# f5 S5 q' N: v! a! H# i0 L
void read_MSG_buffer(int *baseaddr)
/ w. O8 I( j( m. k{# S+ }  W( r! O. Y, z! K6 t
        pRX_MSG_PROTOCOL pshreRAM = NULL;2 [# k, s7 z; R# b3 \

8 P0 B2 v. G3 I6 z2 J! G5 i        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;8 F! S. A; b) l. z

5 r" u9 T3 T8 P4 [        if(pshreRAM->packet_cout != count_copy)
0 ?) S+ e% |+ T- {4 q9 l) ?        {9 Q' s  U' D5 ?: ^7 Q: d
                printf("a is %d\n", pshreRAM->a);! \. b% r. B, N8 i1 d0 C( f
                printf("b is %d\n", pshreRAM->b);! A$ R  M* ?' w  H" W+ D& r
                printf("count is %d\n", pshreRAM->packet_cout);
! X8 p8 S: r7 \% n. p                count_copy = pshreRAM->packet_cout;
7 K& u* |$ e: X$ P: c0 |        }
- P; c6 g( ^% g/ A; ~        else
1 s/ O5 S4 j; U" g( t7 Y        {
. J5 ~/ |" R6 |                printf("No effective message!\n");
5 K6 l! ~; l/ S/ _- [) G' ^% @        }; |- C; }8 f' l+ {' a: ?& Q. M
}
/ m: u' I% U& f
' D. I0 j4 p# T  A' w没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& n  Q- H# B0 ?4 t& p: A4 Y) V$ ^0 @8 L1 O. M6 C/ H. ]

7 J- I8 B/ e  v6 B1 B) H
7 ?  k* h% M4 v6 M; I
7 t% i- y& E; o+ @




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