嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: [* i0 C+ s' w6 J- Z4 I- d
) p  m- ?& H8 e& t& P6 |% @8 {OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% K9 J2 R9 F/ z% ?0 L9 s
#include <unistd.h>
  K8 G- I2 ]- Q2 f* S; p) d#include <sys/mman.h>
  Y; e5 X% {& z1 V' f3 ?3 H$ b#include <sys/types.h>1 p, w( v, ~! q/ x& `* @
#include <fcntl.h>4 Z( A$ H4 e, v5 A1 z, V2 E( X: A
3 @  l; v, l& Y0 |
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
# n1 n, D( t$ X% a/ [! E/ y: B: E+ q) G+ j9 S! i* i, N  f
typedef struct
/ x3 M% o% u' N& ~{
0 [% Z( S, o. B) \$ P2 f3 s        unsigned int a;
" r% g7 d7 f) o( ]4 @% ?1 {9 O        unsigned int b;
  g. I& d( A+ B. u        unsigned int packet_cout;
: q$ `* a6 p) f" o1 I( o& d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 X5 _* ~- ^/ l2 p2 D
- ?- V& d: s/ R, c- x$ Z2 N5 Z) L' I! D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 E4 O, a0 [$ H+ R3 q' n$ T! F
unsigned int count_copy = 0;
# {9 A! n6 i. ~9 u+ P. o4 F4 y' n/ i# W* {
- {; H* a8 V! o
int main(); `" i5 w( {0 y) P# s( L
{
$ [6 F$ W$ D1 G5 H: r0 c4 X        pRX_MSG_PROTOCOL pshreRAM = NULL;& _: U" B& |. C/ U
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% L! A4 e! s5 ~  B+ l! _* M" T% k
        while(1)
7 @3 }0 w- S1 B9 |3 V- K+ e7 w; b# r3 P6 w        {
0 K. ]& p6 k$ j                read_MSG_buffer(pshreRAM);
8 p* t1 \4 [% y3 u. [; M! m, j1 k/ \        }                * h; ^7 A+ h- A- C" y: ~0 M$ X) g( D
}
) W: u" T+ `' v* V+ C; o6 M0 D6 B- b" f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' I5 E, ~# O' ^( N' C! l
{
+ [4 _/ p+ m8 l4 {$ ~        RX_MSG_PROTOCOL buf;6 D/ ^3 ~9 K; j4 x$ `* U, h2 v  R
        
. I' ]$ I7 l# }; l6 J        buf.a = pshreRAM->a;
5 X9 m# P) D: `: }/ u& m        buf.b = pshreRAM->b;
/ k0 D: @1 k: \) `! i) ]# \2 z: N        buf.packet_cout = pshreRAM->packet_cout;
: F- R+ z  n" v  |        
1 J: O( Z+ S$ g- K        if(buf.packet_cout != count_copy)  E, A  L; E" E" h  I$ Q
        {2 m- P4 m" Q5 e
                printf("a is %d\n", buf.a);
9 e# Z: p% K: @                printf("b is %d\n", buf.b);
1 B: s3 \; ~# w! e0 x0 k" N1 L  G                printf("count is %d\n", buf.packet_cout);9 c$ ^  r- Y; j7 F" R- p7 G' }
                count_copy = buf.packet_cout;
; `2 ?7 \" I: i! H        }
/ N9 Y1 q# T& l# A6 K  F        else4 F) g2 d4 w" f+ E( f$ v# O/ _, Y
        {
2 e! E. R% [  L" s) n8 a                printf("No effective message!");
! X1 i$ r  G* h7 Q* k5 B8 B        }( Q2 \7 V  Z* S
}2 c5 i9 o0 R& g5 ?% W

* a! M5 S. G1 ?2 @$ ]& e2 t5 d) j0 L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, n( {& z. i' k1 s
使用下面代码,对内存使用了mmap函数后:
8 ]: p1 i% H  C4 k2 v$ E#include <stdio.h>
* R6 I$ Z7 y2 S' g8 U' Q6 d; L9 F#include <unistd.h>+ p  e/ U$ o( c- w$ v) i" }
#include <sys/mman.h>: G2 k- O3 U& m) U; E
#include <sys/types.h>
6 n" b! b% _# i; |+ D#include <fcntl.h>
( H& g0 B' H8 [+ n4 N% Q, g+ v' n3 I" _3 K% q$ L. D
#define SHAER_RAM_BASE_ADDR    (0x80000000), g) B% X6 Y6 @+ G5 \1 e
#define SHAER_RAM_SIZE         (0x20000)   
4 r4 }0 {1 z( K' s# N; h, J2 L, I& A6 c
typedef struct: K% e. @+ ?- ]$ ~
{
9 s' M" j4 g/ `0 V- p) b! v        unsigned int a;
" x" J; Q* ~7 r. U2 C* x        unsigned int b;! v- G! B- D: \# n. y8 U
        unsigned int packet_cout;
5 v6 F3 l; i- c9 Q: v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; t. @( ]. f1 i
/ c4 C# o& {- @& f" P& pvoid read_MSG_buffer(int *baseaddr);
% i5 r: K# d0 y5 i* wunsigned int count_copy = 0;. o% _# w1 ^( q* B3 R4 `" N; l

9 V0 \# B3 M+ s/ B/ Q$ Eint main()
9 J+ n5 G' V& p7 k) D. S{
& }  i8 q& H# g5 T        int fd;  Y6 Q. h6 X2 F  s1 b
        int *mem = NULL;8 ^# x6 U, E7 x4 X

7 k" q! e+ }0 U0 A        if((fd = open("/dev/mem", O_RDWR)) <0): W* o: R7 @4 ]6 p5 O2 Z( m
        {  g3 k7 u3 |; m) G  f- f
                perror("open error");
# u- u; @3 ~* v& X  _& g                return -1;/ B# ?0 q2 R: @& V) x8 B# q; K
        }. x: W# A3 Z; o" c/ H& L* R
        # a! g/ F6 o, S' \% A$ ^/ I$ Q% O
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ S4 y7 g; f8 }# Y% l

6 K  S  a+ Q) N  k9 L" O        while(1)
& Z: q3 j7 A/ C9 j4 m, E, D        {) k7 q, X7 D7 A$ }) @' r
                read_MSG_buffer(mem);/ Q) ~/ K1 n0 r! a3 \1 T, r
        }               
! F8 Y0 c' r; P5 c- h}
% y. G; _" u. V" l, k! R' G. B5 F, {) Y/ @2 f5 l0 f$ l" x
void read_MSG_buffer(int *baseaddr)2 S. b( Z  ~9 Q+ h3 T
{% s$ b. M* o: T" K! g3 ]7 x
        pRX_MSG_PROTOCOL pshreRAM = NULL;1 P/ j2 U, e7 q3 Z: S& d0 H
- O* I) P$ i% W
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;8 W! x- h  F/ S
  b$ D& F' J& ^' b) a
        if(pshreRAM->packet_cout != count_copy)2 `  I- W3 _3 [7 E1 T
        {; A) f- L! w/ |+ M- {" f
                printf("a is %d\n", pshreRAM->a);
* B; o+ J$ B, R$ I# g. d                printf("b is %d\n", pshreRAM->b);
5 p* }1 B& Q; r                printf("count is %d\n", pshreRAM->packet_cout);
- H9 O9 o+ {" |4 Y8 i5 ?                count_copy = pshreRAM->packet_cout;
  Y+ W/ d/ s+ A1 K% d3 d        }
9 }0 E: V  O4 ?        else
" J& a5 r& K7 _9 G+ `% S        {( w' e$ S3 L5 O! i. q
                printf("No effective message!\n");
" h1 E$ J' M1 k* M8 ?        }
7 V3 K( f+ N" C( }1 X9 D9 i}7 b, R& Q) z7 \, E
% z; I6 }5 `  |8 g2 h, h$ D
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???5 w& x( W) G8 j# b  Y3 f
* O# v. p% c- Q4 {7 v% }
3 o& Y  t7 ]4 E* S5 q% [
' Y0 ~9 {# o5 U6 G2 C

" j7 b# ]7 P$ _" @8 g




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