嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" U9 \, p9 u; T; m2 r) P. c' ~9 ^, s8 v9 D3 e
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>3 ^% |% R1 z6 }  y$ a! I
#include <unistd.h>6 U0 |# F) R  E- k4 e% G
#include <sys/mman.h>
$ t1 t  X4 d6 D- i#include <sys/types.h>9 f, Y: c( c  d; U3 V4 o
#include <fcntl.h>( K5 |! m* E, \. [

1 M* Y( b) h% ]4 _8 S" G' o#define SHAER_RAM_BASE_ADDR    (0x80000000)   
. F1 b- H, v( `; U' P$ ?" G
! Y$ q2 u& z% j) P9 [' r* U* h+ vtypedef struct& q$ x. D8 b6 u1 W4 T( x- T
{1 ?5 m+ k; K8 ]% l& a% O4 n5 C
        unsigned int a;
* V, Z9 m: ?: O! C        unsigned int b;, }; t' m& I1 u
        unsigned int packet_cout;0 {7 M6 \7 _  G% g6 o& h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 P1 @; ^7 [  f1 T$ v( n$ V
! g% E6 d' D# l1 Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ l# N5 {% G& L$ [$ u* _0 t' Q
unsigned int count_copy = 0;! l5 k' j  |' w* p

- X+ ?" f. i( E8 k4 P7 t# \- @1 [5 }+ \! h0 }" e* K5 D* d% o1 r5 y4 o
int main()$ x9 ]/ y: M' b9 r3 b% {
{( P  |* U! d2 _) r- d
        pRX_MSG_PROTOCOL pshreRAM = NULL;, P1 X, [8 a2 i. A( B
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  z+ D# A6 {9 ^2 t9 b; I
0 v( k+ Z; X0 V$ C8 C        while(1)
( m& f' @+ `6 Q/ r$ g        {+ H5 C" M; y& T( L0 j
                read_MSG_buffer(pshreRAM);
$ Y; s% n* \, y! m        }               
' E- J2 z  G  Y) o4 z# U}
0 M( O- H/ g; n& y
+ \$ `! V2 H+ h1 ~. \void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) O- n1 w( z2 p) H4 g% m
{8 L  @2 }( j( f) {! i) [# E/ k
        RX_MSG_PROTOCOL buf;
" I1 U3 M+ T  A; F% o5 C" a        
+ ?* f, k7 S. B2 V        buf.a = pshreRAM->a;  g1 X: S! L- ~2 r
        buf.b = pshreRAM->b;* D6 N/ s7 g2 \' a; L
        buf.packet_cout = pshreRAM->packet_cout;; o5 x% k2 l* p) l1 g* j( T! C1 t6 ?
        : {! c* s% _% ^; r
        if(buf.packet_cout != count_copy)
4 P3 B% U- g- h$ A, t8 N( N$ s' w        {: k/ t0 l* l( N( P9 u2 w! x
                printf("a is %d\n", buf.a);3 K+ n* g  C6 W- C& D1 g4 [6 e+ C
                printf("b is %d\n", buf.b);
% `4 K- U# r/ T& d" w8 ?. ^                printf("count is %d\n", buf.packet_cout);% m/ f! Y3 g( D6 X0 Q: T
                count_copy = buf.packet_cout;
0 K* T8 q+ O" b9 B3 V3 B7 c" r        }
2 X8 Y: k# O+ F$ P9 G2 e# n        else9 ]. L, Z' b& `2 k# ?
        {
) w$ g- C- Q- O: c% c: B$ s                printf("No effective message!");
7 p3 G# t! v6 E- {) v- O( V        }5 l8 ^: W( H9 ]6 X, s- x! i7 V
}2 _8 V- f& F; t' V% D# M' @
% U$ j& m: \( i5 o! b2 T
- h" n# S2 ~  Z  L3 I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。. L. v) G4 Y' i- b# D$ s5 `
使用下面代码,对内存使用了mmap函数后:
* A+ k5 S5 z& A3 \, A#include <stdio.h>7 `8 }( B7 p0 K# Q0 t# P
#include <unistd.h>$ K# l* q7 U0 b9 [" Z8 @
#include <sys/mman.h>' |4 n8 w9 t$ o/ H! c
#include <sys/types.h>
! a" ^6 o0 R9 o8 K: O) P#include <fcntl.h>
" M; f( [3 G5 R5 T
8 g0 q" P4 V# X#define SHAER_RAM_BASE_ADDR    (0x80000000)+ ~! t5 i7 {& H- s) J& n
#define SHAER_RAM_SIZE         (0x20000)   
4 W' r' Q2 M  j3 ~5 x, \& F, v& Z( s% G7 N( s  x
typedef struct
1 ?& |# s* O5 i7 J$ t{6 G9 j2 z9 A8 c2 x2 t; y2 B7 P
        unsigned int a;
4 l( g4 a% H  P" E* c        unsigned int b;
' F" J7 h5 N& z9 ?        unsigned int packet_cout;
: A% S( ?( T* y# x6 q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" B: S, E9 `2 u! X! K+ [6 O9 e4 l, s7 d
. L" D  V6 K+ x. k9 q4 z4 Hvoid read_MSG_buffer(int *baseaddr);+ w! D* ~2 [" |% M6 d, g2 {; Z
unsigned int count_copy = 0;
9 U9 m4 w1 W$ K7 e5 n" ~7 I. M1 X% M4 H+ p" n3 D! V8 Z9 t' R
int main()
4 Z5 j( D, L0 y9 R* E. }$ c! ]7 v, G{
3 t- v; ]: S& o        int fd;3 D$ r4 |. o& m! a" P2 k+ h
        int *mem = NULL;7 w- z/ i' T# m5 b+ `2 @

0 _2 h+ \% [6 a+ c4 y7 _! ]% A        if((fd = open("/dev/mem", O_RDWR)) <0)# j8 d# K: f& y) q6 E
        {
, o2 w7 b5 `: P                perror("open error");
' W. y7 M: P3 J                return -1;
/ Q/ J) h4 k! O, N7 ]7 c        }0 a4 s3 a' W& D
        
. V) z9 ^$ b6 P- U        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);) y+ u1 E2 X7 B+ _/ T* o) e/ ~7 P% v: e

. F. l$ y+ v: b% n$ `: s7 M        while(1)2 l* u! l3 L+ m7 l  a
        {
+ X; U" F% k( @; O                read_MSG_buffer(mem);5 d: ~1 `7 m) }$ r% n! ^
        }               
# R+ ?. u9 @9 c" P}" [/ g; W; O7 e+ p6 X' N' ~
  {$ L5 G! R0 c3 X; s, [
void read_MSG_buffer(int *baseaddr)9 h( u# e- ~9 u! c; J2 }- f2 k# K
{
( k& ]9 O2 t- q2 c/ C( [% v        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 E" V8 s+ e, v( Y" u6 m+ q$ ~7 e7 }* O1 ~
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;  a$ V" R' u9 q: e6 ], h( ?1 U
* {* S: f5 [) j" d; f& l& s& K9 \# x
        if(pshreRAM->packet_cout != count_copy)
" z% G5 B  D* W: E        {
' @, q1 k* Y: o; l                printf("a is %d\n", pshreRAM->a);2 `/ I+ B% c" r% z, E
                printf("b is %d\n", pshreRAM->b);
8 i4 F8 |1 w9 `# Z- k/ ~                printf("count is %d\n", pshreRAM->packet_cout);0 q: f0 e& v# u  Z
                count_copy = pshreRAM->packet_cout;
2 n0 N1 X2 E; f5 k        }
4 V% B2 T/ M* i& [5 I+ j8 E        else
. \" O- Y9 i5 a) ?3 T        {4 N- C" U; F) w: b) Z2 s
                printf("No effective message!\n");
/ `6 {2 W# n* c) s6 f        }8 g+ s4 t  }, O8 l1 E+ ^! w
}) U, C' r+ Q4 D

* M: K; O, W. K9 M4 c5 K没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ Q: X* f& I% S. r4 b, O( q: m* B. J& D2 h0 _: h5 b" x8 b0 K

6 n( U( E+ v+ z- N8 a' T! R1 e% W* @6 W; @

, L% I) _) ^1 d5 r% F  d; J




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