嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : v6 x9 X; P- I

$ o6 W' G, Z  G7 LOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 v  B! c, ^. ?5 z
#include <unistd.h>
9 P6 v/ `4 g1 ^! j' i#include <sys/mman.h>" h9 D& R. ?5 g8 p+ e7 x% q2 W
#include <sys/types.h>& a( E! w4 D9 Z: h' [  B6 Y
#include <fcntl.h>6 ]$ P; T9 ~7 [/ z4 x

6 F) J1 Z+ j$ R+ ?5 w1 ?! k#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 T/ A  L' m8 t4 w5 R( E* b! V# v. ~& m& H  u8 \  W7 {
typedef struct
4 N0 Y6 f, _/ r( |1 n{
9 }' }. D( ^; r3 m% A        unsigned int a;
! q2 i# n( \1 Y# k9 `% R6 G        unsigned int b;
; v' v9 I& U% M1 b6 i8 |" \( j# d# ~" M        unsigned int packet_cout;7 i  u3 {0 R# i  m; e9 ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ D; V9 }. S0 e% [8 R, A( q1 x9 L0 D3 U/ m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ E& V0 v. G2 Q
unsigned int count_copy = 0;
4 o6 G& X9 r: P: j9 t, t7 t7 {$ F- }; g( t& v
+ S& c  e. v  m# n
int main()
; l" T, J9 m: Q$ R2 {% h{
# V- w" f2 c( i' m+ ^$ z/ E        pRX_MSG_PROTOCOL pshreRAM = NULL;+ j% K2 s- J" k3 Q  [
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! W$ Y$ f6 ~- d

  Z( [- T7 B, t1 t0 q4 S' [5 T        while(1): u' {! q4 o0 P; b0 t- h5 T
        {
1 a7 o* A, O& X: `' M                read_MSG_buffer(pshreRAM);$ [& C' f/ t1 P% |9 [+ w
        }               
7 F) V0 ~& M! G# a4 \" v}
: F3 d7 b( n* c/ B0 d# ~, R' w
  L5 ?" _  t" [( S% I7 ]/ w1 {# ?% bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" h% a3 Q; G; h. c
{6 J' ^; C0 n( n7 }+ B* o0 U
        RX_MSG_PROTOCOL buf;
7 s, M' y$ E! ]6 Z3 G3 K        2 M9 L. L  u8 L- v8 O4 Q5 j8 A
        buf.a = pshreRAM->a;- I; ?4 y: P* e% K. l! l% j2 M
        buf.b = pshreRAM->b;
0 X# ?8 ]1 x& @2 H) B# Z        buf.packet_cout = pshreRAM->packet_cout;
. P1 {) C2 k5 G5 E0 C        
6 ]" w- N1 e2 f1 p& Q+ [3 j" o+ c        if(buf.packet_cout != count_copy)
, h' m, w8 Q. g+ p* ]7 p        {0 a4 t$ K1 v; g& h# K! x3 j
                printf("a is %d\n", buf.a);
. O1 n$ \6 q0 p) F- V  V                printf("b is %d\n", buf.b);
! y/ b5 z3 s' S* d                printf("count is %d\n", buf.packet_cout);4 Z! Y( J$ B) c/ Q: w% X7 R' s
                count_copy = buf.packet_cout;
$ P- a8 t9 t  e0 J8 |% G; Q        }
! l8 b# k' u9 H$ ]2 g8 m- b6 P0 Y        else
+ V; a) y# ~8 _; G* }3 o        {3 W' T/ O8 Z; G; z' Z
                printf("No effective message!");
- P, X8 T. ^6 ^, {        }
! ^; \  \* {( m6 H}
, P. }$ n1 K+ j" ~
) H5 N% X7 S- I" L# P7 a9 ]8 M# ^! w4 e4 t0 K
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, \4 j* g$ E5 m4 {. D
使用下面代码,对内存使用了mmap函数后:
# S( U! S7 H0 ^& |* L#include <stdio.h>* X  N% a) U* h; w
#include <unistd.h>
, F2 w, J, D& p& a#include <sys/mman.h>
" R1 K- Q% ?( n% W, |! [* E% t#include <sys/types.h>
! P  ]* Q+ Z" Q$ j/ [* Z6 o#include <fcntl.h>% t; {! q5 r5 L# S3 q3 @5 p$ B* R  o
% p0 B* c' L- _2 n  A: g( g
#define SHAER_RAM_BASE_ADDR    (0x80000000)
% J6 [; x4 S0 ?0 G0 B9 Q" _1 I8 Z#define SHAER_RAM_SIZE         (0x20000)   / A5 i8 X2 Q" t; Y3 c6 q

" L3 b- p7 A! `" J  b' t. W. W0 Qtypedef struct+ g* d2 p+ W: p% S
{
" a2 l" j1 e& F  K2 d        unsigned int a;1 _2 u" i8 z9 z
        unsigned int b;3 c' b5 q  \) z- }
        unsigned int packet_cout;9 ~1 x5 c% T7 u% n' {! c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 z" ~, M4 V% S- K! i
4 o# [+ e& f0 Dvoid read_MSG_buffer(int *baseaddr);
2 K8 C! N6 v1 S- W8 [( ]8 Junsigned int count_copy = 0;
) p0 a4 J8 d. G2 u5 Y; Q& B1 \' N4 h+ U$ w9 V
int main()
$ @0 h: b0 y" ~2 [5 D+ Y; w{* G- S9 d  }; Q( X7 F/ ~& E% b4 }- U  G
        int fd;
" a& D5 Z, d) {7 Z  e- I3 O8 n. {1 W        int *mem = NULL;
. \6 ~& T/ }2 ^; l6 s
7 A" t1 L0 k# u1 b" R2 G: G" ~        if((fd = open("/dev/mem", O_RDWR)) <0)4 J  ]3 g4 h& e9 W0 M
        {$ k/ D) q3 @4 L. }  V+ _0 k% @
                perror("open error");
" M9 E# d1 M# g* [! A2 e                return -1;
9 t; p' _/ O4 V% @6 m        }
- K6 l, Y5 y: r# R+ b        9 N' H" n, D1 a- y
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 s0 |8 ?. k6 n1 s

9 |) W0 Y' ]& }8 y6 x' t/ P        while(1)
+ Z7 w# {, _! E: d: D) I! z        {
4 H* d- |! W6 k( w/ C                read_MSG_buffer(mem);: {  v  I! Y1 a$ N! H  b
        }               
& _2 S1 x! d9 q% G/ n/ R1 ?. V" U}
( \$ P% F+ a' `4 |: L: X/ ?
! ]  [/ t' i/ K; P( Uvoid read_MSG_buffer(int *baseaddr)
9 `2 S/ I& R/ E; H# u{5 |. A5 l- @0 `6 z
        pRX_MSG_PROTOCOL pshreRAM = NULL;0 A, I4 O# M" u( T

& `6 v6 ^1 |7 e        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;' a7 X: P4 R& A/ P$ r. F  _$ l" ~- O
6 B/ D- d6 t2 H# P: F
        if(pshreRAM->packet_cout != count_copy)# q9 m) }+ \- A$ q. U7 ~1 @
        {% l8 R# @, I* s1 q9 R+ S. H
                printf("a is %d\n", pshreRAM->a);: {2 o2 d! @% w" X+ c4 D
                printf("b is %d\n", pshreRAM->b);
2 B/ a, b& B; ~) B3 u4 F* k+ \                printf("count is %d\n", pshreRAM->packet_cout);
) j: D2 l  g0 d4 A! w" M3 I, d$ P                count_copy = pshreRAM->packet_cout;9 D; {0 z4 |) \* L' f
        }" W! `/ r5 s- i: X
        else
2 K" P$ G2 P9 M" M/ u1 Q8 N2 S* L6 M        {' G" B) Y4 s; @2 `. w9 k
                printf("No effective message!\n");
- ?4 n2 Q. n" n  b        }
/ ?9 e! t9 O0 p- V  L% J9 a}
# M  U$ x( p3 x5 U) @
9 B: K+ {; P( I# i; {9 c3 c没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 X/ a% [, Z- j# J- R5 Z9 W4 I! R' W& e
& M  m+ Y( i: ]
% B" W6 O; B7 E0 o4 z; s

/ }( f3 t; u' b" ^, G, p




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