嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ; N8 Q) @0 B' V

5 a; f+ }7 ^" P5 |+ J. c1 kOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( J! b, s* ~1 A1 t5 k" \
#include <unistd.h>/ S* E+ {: I) h7 h6 O. w: b# o9 s: U
#include <sys/mman.h>
, e. h9 D! g5 A( c8 T) T& K#include <sys/types.h>8 Q2 q5 U' |" i. W. A- E$ ?
#include <fcntl.h>
; ^( t9 y& V( }7 M/ [
1 A6 E3 X, L3 S+ Y" d' g#define SHAER_RAM_BASE_ADDR    (0x80000000)   2 i% M- T- ^4 V& d

$ U- ?: Q" L( b' Vtypedef struct; x* Z. f1 C3 E' G( `4 z' F) C
{
- T1 z9 h5 l* k0 ~4 v+ p        unsigned int a;* L6 H, z! F% @9 C
        unsigned int b;+ d$ J; h: p6 C0 a$ o8 C
        unsigned int packet_cout;% s8 v5 D& O3 D* k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! k8 E1 E5 `% n( m8 ~9 @
! L2 o  @9 T8 ^- L2 i% e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* N; x3 o' d. N0 z  H, l7 U) `) Yunsigned int count_copy = 0;
5 P' _* h3 s! J, y' w, k2 N
0 S5 w- q7 v- q" ~: c0 B
& \/ ^" L8 s  W: v4 \  k; Gint main()" z% @8 B" d8 z  M6 a4 o
{: P! f) d4 W. J, }0 {5 i5 J
        pRX_MSG_PROTOCOL pshreRAM = NULL;
( ?! v9 x% Q! x6 c        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;. y8 |4 H: U9 s' M. Y5 o

( N) r# X) N/ G        while(1)
& n2 j! L- ?- v% d* k) I7 E        {( {4 Z; J, g1 l. I  Z
                read_MSG_buffer(pshreRAM);
4 w2 q. r2 L4 t+ ?. E0 p8 X$ b/ I        }               
! d" b" ?2 E- T+ n- r, O}  k; `* K1 k, {5 f# t3 h2 I6 ?

3 K+ |/ N8 S) {6 hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 ]$ k( Y3 `# ~9 V4 o{
/ F  f* L. l' K- e6 z$ Z        RX_MSG_PROTOCOL buf;
1 W" N# w9 A7 e0 S5 ]+ D' W- T& T        ) d. z* E( _* L+ ]# g7 z
        buf.a = pshreRAM->a;
, i* ~9 s' A" @) [2 r: T        buf.b = pshreRAM->b;
- u; O' {' p8 J6 e, _        buf.packet_cout = pshreRAM->packet_cout;
/ n: X7 S6 B/ l+ a        ) M: k- T0 {9 l7 @  R
        if(buf.packet_cout != count_copy)
/ u2 e0 f9 T9 X3 q0 @9 j& f4 q1 c        {: A6 c- r6 H  v* O  }7 ?" N
                printf("a is %d\n", buf.a);/ ?  m& V" {9 P6 D& R: ^
                printf("b is %d\n", buf.b);
& M% B- R8 h) F7 s$ h9 Q                printf("count is %d\n", buf.packet_cout);
' @; i" Y  }$ F3 L                count_copy = buf.packet_cout;5 d5 z) y  v* I, y1 S1 Z8 d
        }2 j4 x2 H& m& E% x0 j- ?
        else
' m6 f, X* |$ s: @' |0 ^        {
$ `( o( B& _9 v. `5 H9 h                printf("No effective message!");
( o. K9 L$ K/ X! \2 K4 ^# t        }  i7 W* X# U1 Y; `. `
}
+ o' ^. b6 f. v- A. j4 ~5 R/ L1 I! Q5 c
$ h; ~+ Y& U$ T3 ?6 V, U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。  q3 L. P% Y+ H% I- E
使用下面代码,对内存使用了mmap函数后:
+ W) [( T0 N& `6 Y#include <stdio.h>
2 _! S( f& l( D2 v4 Z0 B& c) s#include <unistd.h>4 [5 R) U3 f9 `) s: {- a
#include <sys/mman.h>/ n  @' j2 ?' A
#include <sys/types.h>/ A0 c) X0 o* R2 E
#include <fcntl.h>. i7 \% U! H9 u6 b$ Z6 G
# ]$ c1 A3 z, b$ @" b8 J6 f
#define SHAER_RAM_BASE_ADDR    (0x80000000)5 B# t& }8 j8 L% l0 ?
#define SHAER_RAM_SIZE         (0x20000)   
3 L0 _/ A" H1 S# n  C4 T  L/ h  [9 N* x2 s0 v
typedef struct
! ~/ p! p& ]1 w/ |4 l& ^{
- k; |# T. W' \# X        unsigned int a;
! L# l  s, T" X3 g. A, v, Y        unsigned int b;
% j1 l1 w  B9 U7 A& U) n% ^        unsigned int packet_cout;! v9 N' \: o% n$ c* k: S8 }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) N: |7 @( a# @- \

* }* l. Z  g* U/ l0 ivoid read_MSG_buffer(int *baseaddr);) G2 x9 x0 k( v: p
unsigned int count_copy = 0;* i: `  X) L, U" D1 M/ M0 I* h

: @3 u- P/ b8 C% {) {9 lint main()
: {' Q7 {- @9 b/ {1 `( f" P{# f3 r( Z$ P2 _& @0 |
        int fd;
7 ^  m* J6 R  h$ J        int *mem = NULL;
$ b, ]. [- B4 B6 f- M4 {" |1 E$ n
        if((fd = open("/dev/mem", O_RDWR)) <0)1 }+ k9 ]' Q9 S- S. [
        {9 g4 S4 a" M# U
                perror("open error");" M. X; g! h" F8 G. G
                return -1;
: J! B+ }* N8 E6 s/ ?        }  N; H. Z  K2 X' H% z
        
8 J0 D- Z, V# C* U9 P( b        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- A0 ]: V+ L2 m( S# T4 o
, \; m0 j5 d( v. c- i0 l1 g
        while(1)
+ w; D& v2 j# G. m        {" j2 D6 j* j: K4 |, h" E! i
                read_MSG_buffer(mem);
8 U; j6 W1 A9 f0 v        }                9 C2 F( `9 Q3 u9 A3 h8 C
}- u( l! `; _3 H6 m

0 D0 r6 h% U! O5 e. T3 Evoid read_MSG_buffer(int *baseaddr)# z: }5 R- m5 ]
{) w0 G+ x5 u. j  z2 H) J
        pRX_MSG_PROTOCOL pshreRAM = NULL;, A0 f. _. z8 A

2 I/ p4 y( X  B        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! }' z0 X8 W# |2 N1 s
' h7 z: C- u: N3 C& t/ o5 w: a        if(pshreRAM->packet_cout != count_copy)" j; b& F0 a  Y. k- P
        {3 x1 @# N* _; t0 c
                printf("a is %d\n", pshreRAM->a);+ H$ Z& l! Z* _4 Y! v
                printf("b is %d\n", pshreRAM->b);  r$ @0 w; F5 j2 \+ W; _( Z, P
                printf("count is %d\n", pshreRAM->packet_cout);
% @) n% P: {3 V# s# d+ D                count_copy = pshreRAM->packet_cout;
6 c" k, I6 m) o8 R0 i$ H& T        }
( Y; @) J" R$ Q$ ~2 E        else
0 z0 m% a$ F9 z& h, g. C! t. D        {
0 c6 @( i9 T% f4 V. d) v. w0 z                printf("No effective message!\n");' |. |8 J! U& n! w5 i# S7 }
        }+ r, ]" V5 y4 p. M' p5 u8 C9 W
}9 z3 m& k4 y# @0 _* U

; |! \- a$ D" j! \) K没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 O3 g; M" X" Z+ T
2 }2 ]! |" \' o( P5 c
1 L. z% b. S& h& B4 M3 B$ p) Q: o7 y: i6 n3 f5 i1 G) D# i

; p+ r& B& Z2 \) y( G- q




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