嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 o& v/ n7 Y) w; I1 z# w% S/ F* W: A# `) b8 f/ {
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 P7 ]8 y4 n7 E1 {' @2 b4 d#include <unistd.h>2 \5 d. Z: A7 b7 f
#include <sys/mman.h>
+ a% `  ?. {/ }9 d4 R/ C8 g$ f" y: K#include <sys/types.h>
8 _; b8 Y# _$ m& L#include <fcntl.h>  d4 y) z; M5 I2 @( ~
$ z( D* ?2 _+ T& F
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ' x+ e( I" A+ E
7 ~5 r5 z( [# Y6 d3 \
typedef struct4 a2 X8 l: S* X* J3 ^6 V& M: E
{$ _% v& |0 i: y8 |. k$ Q" d
        unsigned int a;7 z/ g$ c5 v* h3 |
        unsigned int b;
' N) y  {/ V, `4 T/ r        unsigned int packet_cout;
+ F6 a  K+ B2 v* R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 m2 b& A4 Z5 j
/ c, g$ x9 F7 U( o6 [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);! J  o+ m2 ?6 H* z
unsigned int count_copy = 0;
4 ?0 l5 L$ ?; j5 E1 m% E
+ r9 c- [4 K  I- K$ B5 Y
5 p5 Z! v8 i% Yint main()' F" r. f7 @2 m4 R2 M- ~
{* p# \4 M0 y, t  h! V; h# q
        pRX_MSG_PROTOCOL pshreRAM = NULL;& B, c: \% Z$ _( C0 S) w6 ~
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 [6 e8 V! M) Q
% E1 i+ ~$ K' ]7 S7 U( b        while(1)
% B3 K) S) @& ]8 H5 A$ b        {
) h6 r1 _1 n; K6 l- u                read_MSG_buffer(pshreRAM);3 P' p2 i( [. W! O3 ^
        }                # K, e5 N4 w. \% K5 T
}8 L+ r! i& {" H( l2 R, d

2 R4 {5 G4 C& P7 q# ~, jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" L7 ~+ B% v. z( [{
0 k% M6 |/ \3 h7 x& m# k$ T& h        RX_MSG_PROTOCOL buf;
$ B" ?, G  C! @6 j& d2 A- w8 Z        . r4 ^, S, D9 i% A
        buf.a = pshreRAM->a;
" T5 u8 ^7 m0 a# E  n        buf.b = pshreRAM->b;: M* E) n& P5 e4 l( f" S4 k
        buf.packet_cout = pshreRAM->packet_cout;  V* R/ h: i' Q- i( C5 t1 }8 W
        . g9 M' U. u' S" \9 x* ^
        if(buf.packet_cout != count_copy)
8 x: C3 P) [8 n7 H8 \) ?' x) ]% S        {
1 K/ w1 ]2 r, V  x5 Z3 b- Q) o& O! v                printf("a is %d\n", buf.a);
0 [8 H8 C( M2 z3 n. a" j% L- @  Q                printf("b is %d\n", buf.b);
# t8 P% T' v/ z8 }0 M* d4 v+ B                printf("count is %d\n", buf.packet_cout);  R# \8 o- s$ d& j
                count_copy = buf.packet_cout;+ G( }8 `# s. h) U: R; K
        }
+ h- I) O& u/ R/ N- A8 u        else% f  P( p5 ]' ^  U* K
        {# M7 X3 \6 e. j3 d6 P! m
                printf("No effective message!");9 W- L( P2 H! c( G. s& m4 E
        }/ G: H3 D) i* |% [0 A/ ?
}2 P# `; C" w% m  H! h
9 w- Z# T& w  R/ V2 B. j( H% c
' R' G/ [! G$ S" m/ P
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 ^5 h1 h# \8 A7 q7 G" r  p( j
使用下面代码,对内存使用了mmap函数后:
2 |; C, l1 O) s: T; n% t2 r#include <stdio.h>4 X0 a: I. N3 C
#include <unistd.h>) F- e" I, D5 \6 E9 Q
#include <sys/mman.h>
7 k; L3 K8 {3 |- e- s* x6 t#include <sys/types.h>
" [. d6 O! |" H% w. r: G#include <fcntl.h>- |5 T7 E: ~5 k/ {
  V# i3 v  k5 t$ V5 ]! q7 V
#define SHAER_RAM_BASE_ADDR    (0x80000000)
" }% p  ?  V& p% c6 a#define SHAER_RAM_SIZE         (0x20000)   
" ]) U! [( p( m0 w6 n
% D0 |+ ?; ~8 d* g3 [7 U1 ^typedef struct
1 }( k5 I  Y3 l4 v1 K6 d! t{. P' m( `  I- t+ }/ D: x8 S3 V: T) G
        unsigned int a;
8 d, ^1 \# _; l4 D        unsigned int b;8 P3 C, U$ @( a- }7 x8 |2 d0 H
        unsigned int packet_cout;2 {% I! K6 Z6 V, Q  }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. Y8 V+ w0 L! V- M0 g

2 `  [3 }0 T* ~, E7 bvoid read_MSG_buffer(int *baseaddr);7 z" l; h1 L: j5 [' V( N
unsigned int count_copy = 0;) e1 ~! v2 U4 A5 o
, ], y) L& @4 i3 q, x7 s
int main()
3 r6 q# ^- w/ a6 J+ ?" z{
. F- ^* V) z# D8 @5 O( k- l9 f        int fd;
' T! z3 u+ M5 K, U" y/ J% e" d        int *mem = NULL;
8 g! t# N( i2 `4 u
  d9 \! \% p2 i% ?, @        if((fd = open("/dev/mem", O_RDWR)) <0)& H3 o  x* m: F# z
        {
3 b/ B0 u# ^; m+ c" D                perror("open error");
7 [4 g4 B2 r( U6 z3 M; u/ s, M. J                return -1;
8 n. @- r7 s. y, A9 P8 G# Z7 B+ z! C. M        }0 [9 a) i) ^3 V7 h/ t. F, A
        
5 M  f2 A$ D4 y: `7 U7 H        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 Z' E: N8 f1 ~- B" R& D8 j) U& D" f
        while(1)( k: d: m( k) H+ }2 d5 G5 X' f
        {
3 [1 X- I: o+ o$ a+ }                read_MSG_buffer(mem);* J" W4 @6 e6 O4 j  n
        }               
4 t- _! `0 ?3 Z! K1 D}  D! D- B; {, L0 d6 b0 P. Z6 u

9 f. K% Y5 k4 L. G+ G) Fvoid read_MSG_buffer(int *baseaddr)+ x" u7 T7 C# S
{8 _- V# X) R( D4 n. o0 {( ]  w
        pRX_MSG_PROTOCOL pshreRAM = NULL;
& F0 U) l, d/ O5 r! {" W
0 y1 g7 C0 u- @" @1 w% S        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 q6 h  c- d, W1 C! n* D
* ]9 J5 w3 h0 A9 P' t        if(pshreRAM->packet_cout != count_copy)2 |5 f5 |5 ^: V- F
        {$ R3 ]" o# R7 c- q
                printf("a is %d\n", pshreRAM->a);
' X, K4 ^+ u. c; N! |& \                printf("b is %d\n", pshreRAM->b);/ f( v0 b# R8 U2 E
                printf("count is %d\n", pshreRAM->packet_cout);
1 k) [& r  m( e! A3 ?                count_copy = pshreRAM->packet_cout;
3 N4 W! z; T2 S+ g        }
+ K1 r% @$ c# H# e! G' _        else  p9 y2 L- H8 ?  S# x/ H3 c
        {
; ~% ?% F. ^! v$ ]3 u                printf("No effective message!\n");
/ W4 c" e) W# U, h2 c$ V3 w. b7 B, j        }
2 ]1 B" A& f) N, ]3 B5 |* Q}7 Z5 l; @! n$ w
' x: n/ D/ k  p7 t3 M) H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 C& ~; S5 l1 w" t+ ^& m7 ^) i; }+ C4 y# ?1 j) ^  O

8 e$ \" }1 X7 @! b
) P% H) M& h! S- Q; W
/ ~! w: X0 K0 i$ j+ @1 K




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