嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) |9 \! a" @8 T1 r- w

9 W. k. F$ E/ c3 ^' x. `6 wOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 F8 D. A3 }2 k#include <unistd.h>
3 g, s) [+ U  a7 M#include <sys/mman.h>) I9 a% V5 R( W" s0 F
#include <sys/types.h>4 @5 h) j- S' f3 n# i8 V& ]8 c
#include <fcntl.h>) Z+ j' `. U- x  B" @' w
$ j  f. u4 }; u" ]9 j8 T' K4 v
#define SHAER_RAM_BASE_ADDR    (0x80000000)     O8 A3 ]* ~% k7 \0 v8 D: W

1 K6 V' _/ i% p4 H% _4 {$ }/ Qtypedef struct4 {, I& e; f  |; l2 X! F
{
: g% G! h* C+ Q% v0 w        unsigned int a;
. q0 H8 y  f  w1 k8 n  i        unsigned int b;
8 s3 @+ {. H) K8 F! d( n        unsigned int packet_cout;
1 K, l1 D! w- e$ s; s3 n. Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* ^9 Q! V2 r- G* P
/ {8 j9 P( W) O& H1 C! L6 w7 E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) j* k2 X) V0 y! f/ n2 @0 v( [unsigned int count_copy = 0;0 c  H, R5 _* B3 J7 d; V( n

9 g* R) H' k, M! t9 Y& j& [- ]$ x6 o2 R2 Z0 k, M5 `
int main()
$ }1 b1 Y2 D( h6 C0 N" U6 Y4 x{
% h9 _$ @2 \1 v7 i5 _3 b        pRX_MSG_PROTOCOL pshreRAM = NULL;
" y6 s0 e5 L* U5 x& C        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 r, g+ O: v1 b* x2 C
6 U: q9 Q' u7 f) K( h2 Y
        while(1)( D7 E4 M) J2 a0 |! R
        {/ i) {  ?; ]6 T6 I  h% m
                read_MSG_buffer(pshreRAM);
$ v* v) H% H. C: n1 W        }                % ^# T' X1 k$ H, |
}
; ~2 b7 G5 o. O0 K; Y: Y* A8 _: g2 r/ v+ A2 Y; ?  x  Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( o6 `: f9 K1 D& l' R  X. a! m{
; y4 I7 N5 m, W$ |1 q        RX_MSG_PROTOCOL buf;
$ S2 O  m9 b( t; A4 z( J% N9 r        ! E. X" g5 z2 l1 o! v; a$ p% N
        buf.a = pshreRAM->a;6 h; X/ `2 D1 ~; Q9 P
        buf.b = pshreRAM->b;: e) v: P5 q, |
        buf.packet_cout = pshreRAM->packet_cout;! Z4 e7 m$ t5 s' J! D9 o% k/ p
        
! ~& j, S! @; C0 G2 u* z5 D. O+ S* U0 @        if(buf.packet_cout != count_copy)( p2 c" i; Z* ^  Y1 W- [- m
        {
  Y; [! t' N  r                printf("a is %d\n", buf.a);
  D( p9 e& w3 W* N# E. A                printf("b is %d\n", buf.b);
% |) V/ X1 I+ D# X4 H  P                printf("count is %d\n", buf.packet_cout);* X. Z. }9 N' {
                count_copy = buf.packet_cout;
6 d6 b& W8 j& @        }& o* k( K% g: T5 a- i" `3 Q
        else0 t- }+ o9 q. \* X2 y
        {8 ]# Z/ v% `& i) }- K
                printf("No effective message!");$ C3 [+ G' w/ E
        }* t  q( R2 t' n# M8 I
}
0 `5 L) q6 H. g9 `: T/ K3 X7 w6 ^6 P/ d* m

5 l5 l2 u& Q& R9 g! I- O但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。5 Y6 W8 X8 ?* z% F
使用下面代码,对内存使用了mmap函数后:
- }" y6 k2 @9 G& ?% s#include <stdio.h>5 W6 b8 [; C5 n! s7 m7 m5 }8 o, L
#include <unistd.h>" _% Q, n4 \+ B* ^0 g* F
#include <sys/mman.h>
: I4 K2 c+ j1 b" |1 s#include <sys/types.h>
, p5 P/ O+ J: z6 Y0 C#include <fcntl.h>4 M# Z4 _1 E; i; q* G: _6 M

: @6 W- ]( ]. o! Q  [: B, d% M#define SHAER_RAM_BASE_ADDR    (0x80000000)+ x8 t# k. K: i$ z3 p  N, l+ H
#define SHAER_RAM_SIZE         (0x20000)   
! G7 N5 d1 c1 l# P! G) P8 o* A6 _/ I% v
typedef struct
0 {$ ?, I* `/ i  }+ W  J8 E{
! e* R% F  F, R9 B( L" N# }& B: @0 W        unsigned int a;( P' e) n- G$ ^# |7 w2 W. [- \
        unsigned int b;
5 L2 @: c0 _5 j% G* P        unsigned int packet_cout;
# ~$ B9 p# M" |: B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! L2 J7 @# L) y6 F$ @! U$ U' q

7 n6 f  X6 @- W1 m) g2 P) {# Bvoid read_MSG_buffer(int *baseaddr);' R4 ]' C/ _& f3 e/ @6 @& c( _4 z
unsigned int count_copy = 0;
* m5 C3 o5 P3 h( ^: M
5 E+ Q. K" V1 r/ f0 I; |int main()
) `1 \1 N- ]& c. {( M) k/ |) G{7 v# O5 h  y1 l' ?: C. ?3 t
        int fd;
* u7 H" d4 G5 |) F% K$ P4 q        int *mem = NULL;9 w: P8 g! Q* l% b" D3 o
8 b  [. A  c' p1 O$ H& p% M% N
        if((fd = open("/dev/mem", O_RDWR)) <0), c% g% Q- j% [8 p: l1 h
        {
& g" J3 Q; j: P$ _                perror("open error");
& V( z1 t& b6 I! k                return -1;
0 H6 c$ a: e2 {) O$ b# d" S        }2 G/ p$ z5 G1 i# ~+ {7 Z
        
, }. X& `7 J+ E        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- ~, ?' O# ]9 q

: N( y7 |, b4 i* L& d: a        while(1)- j) e4 q- E( Q+ t  d
        {
0 ?' ~  K( }; \3 k/ D( E2 E2 j                read_MSG_buffer(mem);
' v9 j9 ^, U% E% O# y. }4 }        }               
+ r( o& }3 Z) {8 b: t3 M}
; g0 N' c. u7 c- W& S4 b$ Y5 p6 Y1 ~0 Z, @% ^
void read_MSG_buffer(int *baseaddr)& P4 g& L" Y" P+ U2 ]
{& g2 ^$ Q) H5 n  `7 `2 O
        pRX_MSG_PROTOCOL pshreRAM = NULL;5 L$ Y: F/ y/ n% @5 j2 t

0 \! J) j( N, N        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 B; j+ W/ y1 i+ {7 H- s4 Q
" P- b% X6 K8 X% \
        if(pshreRAM->packet_cout != count_copy)8 S/ a( ]+ c+ y! X$ r* Q3 J' g
        {) F) H' `( _" o0 z# p' a
                printf("a is %d\n", pshreRAM->a);& X) m! h) L0 u( `
                printf("b is %d\n", pshreRAM->b);
; |' F7 r- L6 H' S  }                printf("count is %d\n", pshreRAM->packet_cout);( P( e+ W7 U6 |; y! P3 {- f! o/ ^
                count_copy = pshreRAM->packet_cout;
0 B7 h( I# o  j3 c( d        }8 V- x4 _8 E/ t9 X, k1 U4 }* N0 n
        else
0 s. w5 l$ i* W& T+ q# q4 ]        {  y% j5 P, Q5 b8 W5 H
                printf("No effective message!\n");5 u3 p! }! X# L1 O
        }3 Y+ n$ k. H/ }& ]
}
9 L1 s' J; U4 J' E8 ^% _* A/ r: ~1 H% M% L" q# A, y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# j1 \! K* N7 L& a, C9 e1 Y, J) r  l# r0 T3 i! j
, k: v6 ?+ @0 r, Z

3 ], r: N* J, a. g/ K3 M: s) M5 {5 k; G. Z& N- I! O/ ]+ u( U





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