嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 V3 w9 D# C9 R& B+ }, p
7 w- a- J- B" kOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& A/ l4 _: a! U# w
#include <unistd.h>
! k( K' Q5 Q' }0 h#include <sys/mman.h>
( D. j1 Y6 N: |#include <sys/types.h>& @! `' {- `4 F) j9 m$ U
#include <fcntl.h>, h; r% G& ~& B  r5 U; d

3 k5 V. r9 }1 k1 {% H#define SHAER_RAM_BASE_ADDR    (0x80000000)   
$ m. A$ [1 F: e4 H! S( p3 P+ Y  ~1 T0 z" U
typedef struct
8 @+ [. i9 B4 x{* I+ B" F1 G7 W) e
        unsigned int a;
  W3 Q1 x2 v- Y# [        unsigned int b;
; Y! e& N2 d9 A        unsigned int packet_cout;# F2 T5 \& @9 H1 d2 P3 c3 l. q7 [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; k# C7 e- ?! p
0 @+ [7 h% J' T( n  ]' ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);0 G1 x: x/ v* e$ ^4 {
unsigned int count_copy = 0;' Q. L' I8 a* `( Z8 h) p
1 w; V  l  M* Q  B
0 b, Q9 I" y8 q3 o4 i: |
int main()
. h* J. e0 Y6 ~) g* j{$ L1 ^2 Y: O! E! P+ g' B8 A
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: z/ F( [! |. q7 N' ?2 w        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 [$ y5 x  m" j) @: s6 r  r5 k3 m
" U4 C0 I' P) j3 v; I: t        while(1)
- `0 K$ W9 E. A; P: [        {
/ S9 Y1 s+ |( p2 ?2 A+ i3 C0 ?                read_MSG_buffer(pshreRAM);  s% W6 m* }6 \! K; Y4 w
        }               
1 {  e, ?( Y9 L5 c' g$ g}
# t5 q7 F1 u' {# v) U) b4 N$ t8 r$ r# x% J: Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 r9 k4 I& ?* T! M8 ?
{2 A8 y9 M. W7 ~% f6 t2 H
        RX_MSG_PROTOCOL buf;9 G6 \- g" `- u1 ^! S6 b: [
        
! t- d8 F3 t4 b& S        buf.a = pshreRAM->a;: ]0 C3 h8 d% O5 s+ g
        buf.b = pshreRAM->b;
& s  E; V5 g7 J/ O8 K        buf.packet_cout = pshreRAM->packet_cout;5 @' f! K. Z0 u/ M" f- y
        3 N2 `3 l3 u& I1 L
        if(buf.packet_cout != count_copy)
& n0 m4 [7 E" U" S# @/ y        {$ V" N/ U, U" \
                printf("a is %d\n", buf.a);# d6 W' G3 i$ W  V3 x8 m" {
                printf("b is %d\n", buf.b);
0 C: W# d4 X; S, t                printf("count is %d\n", buf.packet_cout);) ?9 {4 o, i4 W7 \; n) a
                count_copy = buf.packet_cout;. g: z. _- q( s) ~- d* t' a1 Z
        }( k# x) G8 d3 V5 l1 G
        else& C9 a. i2 k# S8 P2 z/ @
        {
. R/ O$ b* s1 n$ Y( x7 s                printf("No effective message!");
* D% ^, v8 n. W3 n1 x3 h        }- g9 j/ q* Z* z2 D' o" z
}
! c1 K; T# Z* [% A9 ~+ M+ T
3 ]7 g) O0 N) X- S
8 `; ~" w4 G& i1 T/ ^7 h) s但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. i5 q0 v9 i8 H" n# Y8 ]* n4 |) W使用下面代码,对内存使用了mmap函数后:
  Y5 Q" b  R0 n3 a4 @8 K/ d#include <stdio.h>- F( s5 @- F, z' e! B
#include <unistd.h>
" V" t; F- [% F& A, l#include <sys/mman.h>" d& L5 C; @* q2 x$ x
#include <sys/types.h>) R4 z  O- W( n
#include <fcntl.h>
! \; X' p' x, I1 G4 `/ O3 S/ j7 I; v# h3 m) r+ M! ^. d% d9 T. h7 N" S1 |
#define SHAER_RAM_BASE_ADDR    (0x80000000)( d+ F& O4 t4 {
#define SHAER_RAM_SIZE         (0x20000)   
+ M0 K4 F& Y1 Q+ ^5 l
# L/ v2 Q' i0 z9 z; Btypedef struct
* q& ~, |3 }$ [7 j( n  K2 [{  a4 Y! W% {8 H; l7 W8 h
        unsigned int a;
1 S6 c) e4 x5 S- W1 d/ }2 \        unsigned int b;
/ l5 ^- D1 X! B        unsigned int packet_cout;& ]5 c9 d; `8 E( M0 M( g. ?  V& _: U) w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% G$ i$ O5 ?2 |, y, \
* G* G1 d, a% Q6 b7 C8 l+ p/ h2 q( B8 cvoid read_MSG_buffer(int *baseaddr);2 I6 Q( c+ f3 ?- r( X3 [! G4 I$ `
unsigned int count_copy = 0;
, B8 z8 f* k& ?8 M# d* ?9 l' C! E3 G6 q
int main()
$ L  q8 l, F: ^5 k4 c9 }{
  D7 c6 I" |5 W- g        int fd;
: \0 R6 S9 f5 S; L        int *mem = NULL;/ y* ]3 `7 b- J8 |* {# I

' P" m/ I& Q, I' \        if((fd = open("/dev/mem", O_RDWR)) <0)$ O" y7 i7 ~3 ^) w0 l# p
        {0 V- T! |5 b; E3 @) j
                perror("open error");
, |" g4 W1 C3 }( O: M                return -1;: o, |0 R2 C0 T# _5 @' a/ m
        }
7 y  ^1 n4 z* l& {1 n; e        
5 }, s' ~. n8 `3 Q) }" t: M        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; `- g1 j6 A9 f6 y# r$ A

! E, t6 \7 g$ g( }0 w. x        while(1)
) M' @/ w3 k& s( {        {3 ~/ e. J  B* a: L5 V- x# G8 r3 D
                read_MSG_buffer(mem);  i; M: _' s5 X% f; ^6 ?% B
        }                + b  J% e0 f% ?- k
}
2 a" @' j. o" ^2 r: t! s" \' g9 ?2 n- ], D: n* S  K$ N
void read_MSG_buffer(int *baseaddr)% J9 d3 k2 h$ p: E0 o$ Q
{
5 R. u1 F9 w6 Y3 x7 x; f$ t        pRX_MSG_PROTOCOL pshreRAM = NULL;
  c$ }' x. Q' Q7 F6 Z$ C+ b7 Y; N! b! A: n* v2 c+ Y, `+ l8 b4 C
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ ?6 ]9 k6 X9 I6 P% {2 b
- E3 ~9 X3 i3 c5 W        if(pshreRAM->packet_cout != count_copy)
% c- B) I; v5 G0 _0 y1 Q  s' |        {
+ o' ~1 G% w% X/ E7 T                printf("a is %d\n", pshreRAM->a);  ^: w1 [( m+ {. a! H
                printf("b is %d\n", pshreRAM->b);( ~1 V. S# I! v
                printf("count is %d\n", pshreRAM->packet_cout);
' q  @& E: u# Y5 J                count_copy = pshreRAM->packet_cout;5 N3 Q/ V: ~: E) ?: y( V
        }) W9 ?; G  r+ m
        else' Z4 s; _6 Q5 t- q- r
        {
% _2 s0 F# k6 `: J% e                printf("No effective message!\n");
  c4 |$ a5 j& X        }
- i4 D! B; u. o- j6 q}
8 P, q  V) W* s9 _5 Q5 e3 z; ]5 g4 T; v- K# _4 K: i
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
  q3 z; J$ u# w; ?1 z; m. ]
6 P6 K5 s1 f1 C2 H. ]% g
4 r1 e6 a7 Y+ V% a; u6 n6 W/ D: e7 ]: k! ~
2 D  }1 q( x. q* ^  s3 z0 o





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