嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + k( f$ c8 o3 @3 l
2 ~/ p. ]( l* z- t9 ?, M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( f& H5 E+ H+ F
#include <unistd.h>
1 D* F/ p5 ]% ?/ u* z) H8 f#include <sys/mman.h>
6 o% b1 V1 f3 C$ f& b) F( X# i1 O#include <sys/types.h>8 h# b# g9 J! V6 `  K
#include <fcntl.h>( [$ W' a- _) L' n

6 g: y6 d) k" [1 N$ b9 s* \  E2 J#define SHAER_RAM_BASE_ADDR    (0x80000000)   ; a5 E- c) _( S, W1 }$ f( W
6 J) s. ]$ J  M- U2 K0 T
typedef struct4 e4 f$ q  _( e
{
0 K- F3 u$ @9 h2 `* \        unsigned int a;
% x% T1 F/ _5 h: `0 x6 o6 h        unsigned int b;5 C: _1 Y7 k3 \0 T: Y3 C( U) O
        unsigned int packet_cout;
0 y9 c) A0 a5 R/ O6 {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 z8 C9 w  I+ s
* g4 L$ F: j$ U+ d; C0 U: y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% F  k5 M$ H1 `6 @( ]% Hunsigned int count_copy = 0;
6 U3 K. V) _. Q2 ~0 g
0 R0 m& J* p% j" d& B. m
" L" F! B! T# m1 p) uint main()+ S! [" E( K0 q1 G5 `; U! w: W
{
- w  @" D; k. }6 b" i8 X5 {        pRX_MSG_PROTOCOL pshreRAM = NULL;
- U" y  B: @7 {        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% g7 k$ g7 b) k9 f- n. e) {

& v/ g% i, R3 w4 c        while(1)7 g9 w3 \, t! |9 [8 |
        {
5 v- R5 y; S! z3 o                read_MSG_buffer(pshreRAM);8 W* K. y  m- x0 }# h% \* g
        }               
) O0 t* g: p* m}0 m. C3 y6 Z9 N

( i" V% F* y6 D) O3 m. qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM): v& c+ ?5 u% |
{) E9 F5 S7 T! l  t7 I% q
        RX_MSG_PROTOCOL buf;4 l6 x, Y' q" z* f" b: _
        ! T! p# Z# W0 [$ H* l& Q
        buf.a = pshreRAM->a;
4 |8 D. f/ Z' F' x        buf.b = pshreRAM->b;
0 l2 M* v) T  }        buf.packet_cout = pshreRAM->packet_cout;
$ g' X" m1 Z' j7 U) [  b  y        
! X0 j. I( c9 s0 ~' D) H/ P  ?        if(buf.packet_cout != count_copy)2 `: r( l& Z1 T$ w& D
        {
! v9 t' e% R1 t( L' V2 \' ]  G                printf("a is %d\n", buf.a);
/ }# t8 b2 t6 a7 i9 C6 U                printf("b is %d\n", buf.b);5 g* d3 j  v% E
                printf("count is %d\n", buf.packet_cout);
) P" j! d( C* Y/ Y; |* H7 |( t: A                count_copy = buf.packet_cout;
3 j2 C% a. x7 n/ d        }
+ @$ d% P7 l5 {! A) ?        else. p8 ?3 n; ?% b* d) j/ w3 o3 A/ `
        {  n. L$ i% a7 K! f! M! [9 \
                printf("No effective message!");
  v4 v" G2 Y0 i4 c) `% d        }
9 b7 B* P# |, g5 X1 k}
! a4 R/ q( E4 x% ^6 y7 m
% A' S# l% V9 U/ w7 }. ^/ T/ A7 L* v: }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ u, k7 w: i3 r9 \3 X; ]使用下面代码,对内存使用了mmap函数后:- J$ C7 |( D. r& {: U; J
#include <stdio.h>' I' f; P6 i' A
#include <unistd.h>
6 c2 Q- L& L( Z$ ]  u8 ^#include <sys/mman.h>
* D4 N! S& i  ^2 k0 s$ _4 k#include <sys/types.h>6 E" `1 ^3 J$ B# L5 S
#include <fcntl.h>
) x4 ~9 }# P+ c( j& w( t: |! @* y+ V" n& B( [3 x) @
#define SHAER_RAM_BASE_ADDR    (0x80000000)
9 `/ x, T9 k  |0 A6 j: o#define SHAER_RAM_SIZE         (0x20000)   2 w4 k3 m0 u" [4 W' }. J$ H. y

4 H; V! ~$ ^9 y8 |typedef struct
8 }2 a' X3 A6 ]4 U{
+ }4 u, {  d. v* W8 M        unsigned int a;
% O3 u* f  l# c  w# ~        unsigned int b;$ B/ m: l5 i% r4 V
        unsigned int packet_cout;5 V  Y+ V: P) V" v# P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ ^6 C) i5 v0 U7 }
$ M& q$ j  T  e: ^' {. J: c( jvoid read_MSG_buffer(int *baseaddr);
7 p' L4 F4 i' Aunsigned int count_copy = 0;; T4 m6 k6 W; }5 t' h
' Q  M1 ?: e( T) y2 f1 y$ l+ J
int main()( R5 S9 K) |$ E1 V' U7 J$ A
{
% S1 {9 ?/ q. u' D1 l6 k        int fd;8 ?. r* j. l1 V  r
        int *mem = NULL;
6 ~$ M3 H- c9 ~; f4 i
( j) t$ k# Z, K+ q# k        if((fd = open("/dev/mem", O_RDWR)) <0)+ e: U1 b! ?" @6 i  k
        {9 `: m8 g2 X% a7 e5 b, A
                perror("open error");- l1 k4 |0 R" a) M) S
                return -1;
% j- ]) @5 ^$ Y- `- j4 x9 R        }8 ^% _+ c+ t# S. ?& Y5 s. v6 j/ g
        
+ N( t" o# B' U- x4 i        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' c8 S# F" @: j  w) Q; w( a4 P
5 D9 {% v' q& K) L0 x3 d        while(1); C! x- F0 j; r& B) K/ {, A
        {
0 b' X. m. m7 a* ]( ~: C# u3 n/ \# }                read_MSG_buffer(mem);9 y9 }  q( Z# C6 _  t
        }               
4 g% _, D$ s) G- y5 F& P}' f1 p& [. `; S- U4 a: m1 n9 @
; J- s6 f2 H( Y3 ~* \
void read_MSG_buffer(int *baseaddr): M: t: g" ]8 S) K8 F/ ]1 f( d
{$ p  Q4 v) q$ M- }! c
        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 r6 L) J! I0 ?/ l$ r+ ~* S8 r5 M% q4 d9 I/ E) F0 |
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; Z) G! l7 E, f$ l5 o
9 \# l' q! i* W6 a" [( y" _3 I, m
        if(pshreRAM->packet_cout != count_copy)
9 g2 L) K) H4 }6 w$ y        {& z. y; k/ m1 K! A) J& P4 R6 s
                printf("a is %d\n", pshreRAM->a);
1 q, j) c; a# A+ `                printf("b is %d\n", pshreRAM->b);
. A9 L/ B) V* m& N                printf("count is %d\n", pshreRAM->packet_cout);
- [+ e8 X0 K( l7 o0 `& h                count_copy = pshreRAM->packet_cout;. K' P8 u& t' U7 M- a
        }( G: Q. c7 V, W' z
        else
! M' L- A! Z: Y, Q; `3 ^6 W        {( g* a8 g" O  }1 o
                printf("No effective message!\n");
+ Y7 x% _- s# r  l/ W- M        }" @! E" U+ \2 `: A& H  @
}3 [; ]4 y; p6 |  Z
" L0 }$ g0 `0 o. p% A. z8 _) r1 k( J
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: {) _: ~5 {9 f
: O* r% i4 J2 X3 W+ y, }

  B; T# E. z' {0 ]+ u8 s! y9 a( u* J8 l+ c, ]

/ S' ~0 r& d) R( p' S$ b+ i




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