嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
$ r1 M" C. K  |9 \7 P' T0 E' D% s
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: U5 o' a0 r' y- `* y" q7 G
#include <unistd.h>
* H  ~8 I) A2 Q( Q" q" l  r4 M#include <sys/mman.h>/ l; [' Q" E4 e5 L0 ]
#include <sys/types.h>
+ B6 i; `5 g$ u& Z) `. K#include <fcntl.h>
( H% r. j3 ^" `! p" ]& o' u: F, O( i! h4 F9 f& Q
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) U* a  \3 e) m; C/ b! ]  g0 \
/ U3 `& p$ W$ k2 O. y" J5 Mtypedef struct
' J! [3 o! V- t2 G8 o* a{( M) J, |) N9 \0 b. H" X
        unsigned int a;
& N4 M" m6 }0 |        unsigned int b;2 G# C0 p8 b8 i) b
        unsigned int packet_cout;& s! g2 Y6 }! N# f0 m: {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. h7 w6 ~" P1 V% j5 X* ~$ ?0 D& A- r8 |2 x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 V9 F& U3 n8 p& ^4 X+ s* ]
unsigned int count_copy = 0;
, r) ~; g# u7 s$ V- j
( q  P3 H: D7 c6 X+ S) B  C# P* a# T  P, F' U, ~
int main()
* k! v2 m+ b+ _3 j$ z* \, ]{
1 J/ v2 ~2 P! I$ k7 x5 [; B        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ q9 ]' p/ T$ }  u9 Q        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ t) Z) \- Q1 q. X
% c  \8 K9 P: E8 K/ z
        while(1)
# h- U5 a# V/ a& b7 @- I  d        {
  @% B  n6 ?  Z. C, G9 A$ h                read_MSG_buffer(pshreRAM);
. A+ _1 M- Y  g/ \- K& x        }                ' G/ H4 O) Q9 {2 C" S5 z  ?! j9 @8 q
}
6 C  ~$ m5 i+ `# t. V
" }: m# B3 y- _6 gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 Q8 u& E: ]! F/ v
{/ \4 e& \$ v5 v$ w% i( i
        RX_MSG_PROTOCOL buf;
4 c/ y7 q) L7 H$ `( Q) a& }        
6 x0 U5 C5 |* b; A        buf.a = pshreRAM->a;
" O9 F$ r$ g: C. A9 O9 f        buf.b = pshreRAM->b;0 \# Q# L, |! ?9 G& n, _, {- Z
        buf.packet_cout = pshreRAM->packet_cout;
3 q9 h. o6 O  x. T        ' D: m9 i: _/ }8 `) q
        if(buf.packet_cout != count_copy)
, a' Y8 m0 m  a        {7 M2 s$ z/ }8 F& D" w% k5 s
                printf("a is %d\n", buf.a);" V5 H; Z+ w- W
                printf("b is %d\n", buf.b);
* ^; S1 Q' S3 N, _( I$ b                printf("count is %d\n", buf.packet_cout);& `8 U$ G: k/ W0 U
                count_copy = buf.packet_cout;
; l# l- }% w. b- J. w        }$ H/ ]8 J7 H' V) a3 @6 z
        else
" b9 _# I0 }) S5 P& E$ T        {
4 Z, @7 W% k; }. q6 i/ g7 }$ s                printf("No effective message!");& O  I$ ^) n, g  Z
        }
/ S5 h. }  d# }/ ?}8 q9 @9 D: l, |7 v6 r  M
, K+ L2 B0 Z7 _( o& J% y) r
! d# E/ S0 T+ K
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 w. ]& F" c+ g" S% V8 H6 E: e/ a# K使用下面代码,对内存使用了mmap函数后:7 r3 ^* R! x# t6 q
#include <stdio.h>/ y6 ^- v% I& J5 w! _
#include <unistd.h>
& |3 O$ c- b' u1 h! E! }#include <sys/mman.h>
6 E/ J; i; \+ @3 ?/ r+ e( I#include <sys/types.h>0 r% F4 x' a9 P- ^9 U8 h8 K
#include <fcntl.h>
& G) l. W8 o. q: y* d" S9 P, e" l3 M  z" b) i! J3 N
#define SHAER_RAM_BASE_ADDR    (0x80000000)
" \  [9 x  S7 x# h3 {/ s#define SHAER_RAM_SIZE         (0x20000)   ) U/ \8 X& U2 r- G0 v* d- I0 l" n
4 j: h% e# V6 T) X  i
typedef struct9 Q- I! ?: G! ?1 e$ w# u
{
8 B! _$ \2 s# k& |& s6 B- i        unsigned int a;& l; g8 S" _" u* R& x
        unsigned int b;
2 {' f3 ^: S0 ^        unsigned int packet_cout;
' a' ?: u( v. D- U3 h. v! C, J3 m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  a' L% |2 M4 e: L7 s4 z: Z" U5 {' z0 S: }+ a
void read_MSG_buffer(int *baseaddr);
' {1 C0 d3 x. H3 X9 v; Runsigned int count_copy = 0;7 J2 M) b- H# [8 X8 D" r
6 a7 g3 E3 M9 l) z: j; Y6 H
int main()
7 [4 e9 j5 _( t* ]: K' x{
- c2 Z% \$ c2 D8 X' S% e4 T; f" p        int fd;0 M+ v" }. L9 {5 }+ A
        int *mem = NULL;
7 r& ?4 K8 [3 Y  g  Q/ P5 Z! N  W2 p2 u- \  \1 Z0 M
        if((fd = open("/dev/mem", O_RDWR)) <0)$ Q& p, ?. Q! e& r* S# m$ |( A
        {
: ?% a; B3 ~1 {  F* P                perror("open error");& x5 r( Q0 ~& L( m
                return -1;
- ?2 c4 w7 j; l5 z5 @0 p        }
* L- S4 Y3 j/ ]0 {/ U5 |& o. t        
0 h5 F! {- w5 E        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( G, O+ Q. u8 X8 F0 Y2 R  j$ _) F* w* W+ {
        while(1)
6 X  e+ @; F5 \" X' z5 A# I        {
3 U4 F0 R5 Y" n( o# k& _5 h                read_MSG_buffer(mem);
" o" _2 ?. |: _+ T5 k" g) s) L  k        }               
2 l" G1 }- {6 a2 O. B}
8 {9 F; E0 Y$ }& [8 K4 }: P) k! t& ]3 R+ Y3 p$ J
void read_MSG_buffer(int *baseaddr)& k% l; ~3 d  C- }2 ?& C
{
; [3 d8 K7 B, g" B  P        pRX_MSG_PROTOCOL pshreRAM = NULL;3 z2 P) D0 {, h. |
8 ^  u5 Z, J1 R  V( j* b4 y2 Y
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( [& R5 U& d. O% a  @# s0 `' ~
7 g# t9 m4 W6 n! P8 z4 R        if(pshreRAM->packet_cout != count_copy)$ R. l! `/ P. O
        {
6 I" j9 w. P; l/ ~                printf("a is %d\n", pshreRAM->a);, H' \* ~8 ?" K* z+ S8 @; r
                printf("b is %d\n", pshreRAM->b);
; S2 d: Y8 ]" h" d- _  n. T                printf("count is %d\n", pshreRAM->packet_cout);
$ g( \' m8 O. g- P6 T8 K5 z" x* `                count_copy = pshreRAM->packet_cout;* S; V2 p/ n3 m3 g- |! d5 H/ o
        }
& V4 m( m* L' N4 p; E( K1 N        else
- C- v1 o* P$ u. z, s7 \6 z        {
/ X& o( X/ T9 \: m8 o) N5 G                printf("No effective message!\n");
( u* R4 F: `& @9 X        }; w& t% |8 J2 \/ O* U
}( T4 t' D6 |) S6 Z( R1 i
: X8 L* P" s4 u1 Y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 n+ y& F1 y# m$ A
  W. X+ r4 m. D4 O
, w6 X1 u7 ?. ?1 a$ g
1 P" ~' U. E& b$ S* B! c
  [3 {+ m' _! x* n. x





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