嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # O4 A1 a9 ~( {4 x( L

% M7 L1 I. C4 Q" \# {0 P- N2 IOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 H$ U3 T& {' N
#include <unistd.h>9 `) [! L5 ]% I. i
#include <sys/mman.h>
! w6 K: A0 R! B4 E# o' Y, x' y- a; p! v#include <sys/types.h>
. p7 o! ]% j7 H2 F6 Y! d#include <fcntl.h>0 R# V, B; q4 F: A2 V& \
! Z  r4 C. ^, }$ A9 _& D# f6 o" y
#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 |( Q$ x( `" N7 i

' e- S8 H0 e7 V# v2 X/ mtypedef struct
$ P5 r6 {4 W8 w1 {/ ?" Q1 M$ K' F{
( h: X* ~7 v) |& s( y8 i        unsigned int a;1 p5 N8 [+ I1 s: W3 _1 d2 P) Y2 U9 [
        unsigned int b;
) o( ?. a  C- T) p$ Q) S  v        unsigned int packet_cout;  G: {: i- Y8 _" T# o4 k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( t6 b. N3 R3 z7 y/ d" r! d( ~5 f
' K1 z1 R8 m. f* M8 m2 W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 }; |  I7 ~1 H/ e
unsigned int count_copy = 0;
" v! e% m; o  b# n! w# B
2 Q6 G2 @4 [* R' f, Y0 I+ _( q( k! ^
! t, A: ~; c6 j/ e' P% E# Dint main()
6 E3 e4 O* I- z- a2 T. t. i! G: j{, ~1 R5 u3 x& m) u
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! l5 {, y6 X1 N, c+ v+ w        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;. N* G' s" @5 }0 z; S8 a
1 B; `$ H/ Y" C2 o5 X0 O
        while(1)! c5 l6 n: U4 F9 M
        {9 D& |( {: y. m
                read_MSG_buffer(pshreRAM);5 {  B4 D, i/ I, {3 _
        }               
5 [8 T8 j1 I$ J; _; n9 p# Q0 @}  t1 ]% \( y( o" w7 I* X; A, I

# k5 ^" }7 I' Svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) R4 h/ o4 S7 D; p$ ^
{
6 Z& C& Z& P# `' E        RX_MSG_PROTOCOL buf;
0 o# z* Q3 N! D" N8 Z! o, J        ; `" f- t& p; d% M0 H1 |
        buf.a = pshreRAM->a;
) D6 i: ]% S# C! S6 G3 t" \/ E2 k        buf.b = pshreRAM->b;3 F: W$ B+ P- q) o( {3 L) R
        buf.packet_cout = pshreRAM->packet_cout;
( X9 A6 N: B6 O& q* A1 i' p        ! c' G% }0 ]# U
        if(buf.packet_cout != count_copy)
; h. S& M9 ^  V- B        {" K+ f+ }4 @* Y
                printf("a is %d\n", buf.a);( P; y5 F: }  d3 f: E; t
                printf("b is %d\n", buf.b);0 E' i# g4 Q" L$ y9 e7 @& E6 q
                printf("count is %d\n", buf.packet_cout);7 @  m, K6 n* R& a$ C* f( H
                count_copy = buf.packet_cout;
8 X5 `7 W/ X- k* F! ?! S2 ~3 Q. E        }
' l( Z, I0 h( J( l3 e        else
8 W: D3 t+ Z# X* _, k        {8 p) `/ P4 p7 |9 \# J; {
                printf("No effective message!");
8 ^+ Z$ E8 p% j. w& C        }" N5 F! V! t7 p! `/ R
}, E; e" {. v, j, h1 [$ W& z

, Z: T0 K5 B( z) U2 w# C' D1 W/ c2 B8 p4 _
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; U7 R* `/ M. R! H: o5 s$ w
使用下面代码,对内存使用了mmap函数后:
0 y8 [. M2 L: Q# j6 ]- l#include <stdio.h>
4 c/ `6 ?6 d0 s" n0 J  Y; L9 ^0 K7 {( j#include <unistd.h>
; S3 ~& C) y" C9 {#include <sys/mman.h>
* q$ l! @: K4 g; v#include <sys/types.h>. M2 A1 q& s7 O  ~2 S3 _1 i" x
#include <fcntl.h>- |4 F6 T. A/ @, ?

+ @; W+ r% C2 a0 _9 F#define SHAER_RAM_BASE_ADDR    (0x80000000)- X2 `1 V$ y3 [1 t9 V  x; ]+ J  j
#define SHAER_RAM_SIZE         (0x20000)   
1 }# f/ V- i; Y) B9 S1 a' i- ]# D( T! j) ]
typedef struct2 p& \, A" ~' @9 K( h& Y9 a
{9 F( m$ s3 C, L& [) u. u% Z
        unsigned int a;
  D, x1 g( |0 T" q1 J. D, P: ]3 i2 S        unsigned int b;
5 L. X; d. o0 k        unsigned int packet_cout;: f" d0 f$ b$ Y6 ?; B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 v5 T6 w+ H( o5 o5 L% n
+ Y7 X/ t5 ]  O+ Wvoid read_MSG_buffer(int *baseaddr);
! U5 z  p: X0 b5 V; A2 eunsigned int count_copy = 0;
2 X/ j' ~7 i9 p
5 {, x6 Y0 [/ g* t8 a/ ~; @int main()
* w- [( _8 m' `7 r  ]- y! b" L{5 y! k  Z( X9 [4 L
        int fd;
. x+ a( l5 L. E; f& r) j7 V8 O        int *mem = NULL;( }) U- d7 @8 g/ U
; A' H: h, M/ D+ v
        if((fd = open("/dev/mem", O_RDWR)) <0)
0 h4 `* Q% ]0 Z' V        {& v1 v" Y4 m- t. g" ?$ ~! ~/ j0 Y
                perror("open error");( r, ]; W+ p; Y# j5 Z
                return -1;
: G. ~" H9 [0 m1 a7 k4 R9 _3 u( z" Q        }
8 j+ v' q$ y6 J# ]) \, I* D        
: U/ T! D( w) q        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ w$ C7 T( e- B& r7 [) [
+ L% K  ^# \. x8 W; j5 r        while(1)6 @" n3 d( P& Q7 b! Z6 k
        {% }' F+ `0 K  ~1 G8 z& D
                read_MSG_buffer(mem);' V# o4 j2 q6 w, J6 ?# \% h0 r7 }* k
        }                * H  Y( n3 B- e6 R, _$ W* g1 r
}
' D4 Q% |' G6 Y6 O
# o" F1 T! X% c1 C+ Gvoid read_MSG_buffer(int *baseaddr)
, w$ y) m5 |+ u4 R3 q# Q3 S+ Z{1 z. M% q* S& S4 l
        pRX_MSG_PROTOCOL pshreRAM = NULL;, e7 l5 ?# T% G5 V# g- X  y4 t

% r% @5 F6 z, g; b' w* [        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- b* w8 _9 e. U! N" T. d) i( Q; Y0 \4 u
        if(pshreRAM->packet_cout != count_copy)
; L5 P8 Q5 A7 _/ ~$ p        {
  k4 W8 u# E2 V1 [9 U                printf("a is %d\n", pshreRAM->a);" k5 D! o8 T0 i7 {4 F$ _
                printf("b is %d\n", pshreRAM->b);: M" C* c( I# C, b+ \- s9 f7 Z
                printf("count is %d\n", pshreRAM->packet_cout);! V! }; ]! i& r3 e$ E2 r8 }# t
                count_copy = pshreRAM->packet_cout;
' r! t( u$ r  a/ s% F        }9 E$ E: s& h! E- ?
        else
; O- U# c1 X8 }, a        {& `1 x" B; }& y, t' h5 a
                printf("No effective message!\n");
( U  f$ y% }0 @/ w: v- w% j        }. e9 ~2 \3 I! P
}
3 n+ J% i3 F0 b- ?. ~* G+ X( I" A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% Z( }9 ^% u, z6 a5 w
+ {7 |6 F+ F# l9 }' k, G6 K
" `5 i& |( ]: h2 i9 m! ~
* a% o( h$ x5 }; ?# D1 N' `# \$ x" P

- _1 F: B' i0 P& k) b9 q




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