嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 f% y2 ^2 U' K; p4 c7 V
* L  }6 _# V. p, G: P' d# R* v4 z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' p! ]' Y, q! |  L- I2 p$ P' N
#include <unistd.h>
& G& w; ?5 q% K5 y! g#include <sys/mman.h>  S" r( W8 V0 A. a) W( ^3 V5 w+ k
#include <sys/types.h>
( ?% o# b; {" h$ V! p* p7 y#include <fcntl.h>3 C' r1 k4 ?/ {( s1 o

; A$ w6 b9 u6 W  _; h% ?#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* ]% S" v- p+ U$ j/ O1 x
2 `% R" o; |% y2 w8 y* t5 }7 F5 Ttypedef struct  F6 M7 B8 H& L$ H$ f' V2 e" H& F
{
$ |8 L0 m  _$ `        unsigned int a;
" V, l8 ~, ~2 h        unsigned int b;+ [5 n6 R2 A! K/ {6 w
        unsigned int packet_cout;& D: c  }- ^8 E0 @; Y2 \. e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 b/ m& N8 @# i. [6 D) {

/ a& _9 Y5 F0 D& ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 V$ R% b  v/ y6 ?
unsigned int count_copy = 0;6 w5 M" f7 f3 K' F  ~) b) b2 N

1 u% J) v' e0 v- Z$ K" I" N6 G% ]2 N: h% z+ P7 f0 t5 d; F
int main()
! V6 [' G8 r, a" b5 `# g0 @{6 Z4 A  {( x( e4 K6 I
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 l: g" X+ F4 E3 B+ Z
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% J9 ^" _" Q2 k( p  I" ~. D% E+ G1 D6 \2 i( @6 S5 _
        while(1)0 h7 O8 s$ z" u, a
        {3 Y2 k- Y0 k$ [) ^2 N
                read_MSG_buffer(pshreRAM);
0 [1 J/ E1 H; a        }               
( ]6 R" v$ \1 b& |& K}+ l$ T& v8 ~# \
  |# x" w' f% x. o  W# c) X& s7 r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ ~  a1 }8 t. |+ X8 C
{. D- p2 p7 a/ v# ~
        RX_MSG_PROTOCOL buf;2 T1 y0 Z- D$ Z1 `
        
* J. A% b9 g* o, w0 x8 Q" s: L- G        buf.a = pshreRAM->a;
: o" i3 T6 T# j) K        buf.b = pshreRAM->b;1 ?! `3 j4 D* R" U6 d! q
        buf.packet_cout = pshreRAM->packet_cout;1 S+ Y5 l) I: L
        5 g- V3 A* K0 g1 h" _5 {, ?- x
        if(buf.packet_cout != count_copy)7 U. z$ s' _' V- D% {  i  z
        {
* J3 j5 z9 I  a! z! H; V1 f                printf("a is %d\n", buf.a);
: T! k( s% k5 L7 E# d                printf("b is %d\n", buf.b);
, U' {5 y# l6 O6 R: R' d7 S- I, c                printf("count is %d\n", buf.packet_cout);: P, u6 L7 L, b  A
                count_copy = buf.packet_cout;* j3 J8 i" T! R( p6 x1 p
        }5 k* ]0 X/ Y# D" v  G9 D; m
        else
1 P: X' z2 U: ~/ h3 b  e0 {        {& T+ a- H- b; u7 O6 B
                printf("No effective message!");
: L5 Y5 }. a% p" w3 B        }9 R% y* D; ?% M
}# A. g5 L7 i! {1 w

( j5 n0 d4 R4 \' u4 n" ]8 Q! |# @) T* e( e8 }; w1 k2 @
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 e# u+ Y" j3 r( z6 ]使用下面代码,对内存使用了mmap函数后:: L6 T& O2 G4 Q
#include <stdio.h>
1 ~' w$ e( l. g- v$ ?#include <unistd.h>1 L7 a1 s( U6 t% ^! h' T) O
#include <sys/mman.h>
: I9 e6 H" Y! G- U#include <sys/types.h>5 `* ?, ^+ r, [! J3 N
#include <fcntl.h># d8 j: z9 G7 k$ G, y
2 Z, w. l: e# e
#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 l  w2 Q/ h3 i9 M8 `7 I: q#define SHAER_RAM_SIZE         (0x20000)   
- i: o  ~+ I  r# [) x2 b8 G0 A! u6 n8 F! j  \
typedef struct  I8 R6 f$ m' t4 A' E) c" D
{$ ^+ f" p/ p" ?5 e) ^" j
        unsigned int a;
% |, }) K% @4 H+ Y' a) g3 ~/ ]        unsigned int b;) p2 S8 f1 l, a" i
        unsigned int packet_cout;# J7 L0 _" P3 U7 X  D. j% \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; ]! n) K: u# L9 q! T8 M: O$ c; I% a3 K7 x9 x4 Y. O
void read_MSG_buffer(int *baseaddr);3 R/ v2 C) g2 j, E
unsigned int count_copy = 0;" ?6 G( n& `# P/ h4 T

: ]) s2 l4 ^: g5 Sint main()
" t( @% I7 f' ?{
) q  W: Y7 M" w- H9 \        int fd;
8 h5 w9 ~0 |. ?: A        int *mem = NULL;
. Z( J+ a# b" F
+ f+ u# [! a3 T        if((fd = open("/dev/mem", O_RDWR)) <0): E8 i- ]4 `, |# d( @$ \# _- t
        {
: l* W! O7 ^: q                perror("open error");! }% d9 N6 x8 r  h' f  W, @4 p
                return -1;$ c/ F5 z1 }( n# M$ n" E! Z
        }
) T' r: I+ u" }  f( C        0 z! y  v. x# e- v( S
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 g. f9 G2 ?( _/ `) Y+ s/ k3 i; x6 J9 u8 Q. ^
        while(1)
5 O) {1 Z- E+ ^/ R. A  O        {. Z7 _) n) `2 T( Z( k9 h, F$ t- a
                read_MSG_buffer(mem);3 W: i$ Q: G) X* T1 n7 a: A
        }                ) k4 s" `1 V' J; I! h
}
$ n, h( O( j! r  P# i. Z" h  }0 _+ @/ P/ R: m- e! q/ d8 P
void read_MSG_buffer(int *baseaddr)
" P8 Y9 w2 P. C{
: F! z; t$ K- r- e6 T/ u        pRX_MSG_PROTOCOL pshreRAM = NULL;
# x& m5 x5 o+ Y6 ?9 I3 i) M$ `8 u4 G6 ]
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 \3 B$ k# v0 M$ l
0 S4 K7 ^( q4 O6 o' V2 ^# {        if(pshreRAM->packet_cout != count_copy)2 }! c+ \$ a  s1 @5 V
        {( \3 z0 }: m( F9 s9 Z
                printf("a is %d\n", pshreRAM->a);
1 }, h6 Z( L8 S2 D                printf("b is %d\n", pshreRAM->b);
; G+ `8 i! g1 J9 G3 R' b                printf("count is %d\n", pshreRAM->packet_cout);
; W$ P  |" ~+ D. S( I4 S" T                count_copy = pshreRAM->packet_cout;+ i4 Y1 P1 U% Q
        }/ H* I& i% p5 W9 f9 w0 i- l/ n
        else1 k8 I- G$ R* F! K8 r, Y
        {
/ V/ T  X' ~2 N8 w, l9 ?* A                printf("No effective message!\n");
; Z7 s9 L. ?. s. h9 n        }" F: U; ?* L+ h/ F
}3 e- E: [) r+ d3 D' N& C8 g
$ p9 |" i8 r5 _: F+ }8 x) j
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& z+ N5 ]- c( W* @! \4 s0 k6 r' ?
, Y0 n7 [1 g$ ?
4 u  h0 c9 m' K+ v" F' j' o5 p
9 }  M: u1 B% v7 D% y; X4 k* p
+ m& k1 d, V% W# X/ M





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