嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 M+ w0 ^) Z0 ]- `) h3 O4 G
4 e! o' Y  ^& V; J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! P( h, ~( w- A: y; o
#include <unistd.h># d  I6 \: N5 m5 E& D% E9 b* c
#include <sys/mman.h>
" y! d! c* O7 c2 i7 S( c#include <sys/types.h>- |& b% x: H0 ^5 S
#include <fcntl.h>
3 T+ Q6 ^' S3 z! n
+ j( o$ @4 v' H#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 r; k2 l4 }' X7 K' `9 d. v# u) Q0 {
typedef struct
* t3 ~6 c! t. Y; S* g6 W{: ]3 v* s; w5 h- k" H1 |/ T) v* u
        unsigned int a;
, s& I. @) \2 y9 x        unsigned int b;" \8 w  R& V1 f+ K
        unsigned int packet_cout;
8 j* T, _, K! V" |0 B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# J+ ~7 O" F# W, y/ g8 x1 m' H
/ v3 k/ o# }% c, i- gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' H) w1 i5 d2 x' h1 E6 P) ^5 C
unsigned int count_copy = 0;( B1 f8 |. {( G+ K# V. d3 ~8 \( X
/ C5 c" o0 u' @$ C' r( m& R

/ P) t' V1 |: P7 i" }int main()* o7 a5 a  C. s. A% r: I" Y
{
: U. B- C, E6 i. E9 F7 i* p: O        pRX_MSG_PROTOCOL pshreRAM = NULL;. D; C( @) q5 H! |& E6 i2 p
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 F1 H5 g& M1 a" g/ i

+ f- D- I/ d$ v( X        while(1)
- ^. o% J( H' f8 {5 Y7 F5 u( s, v        {
& {8 D& R4 `& Z9 o# z) W                read_MSG_buffer(pshreRAM);5 q- H/ \1 P; S/ ?' I4 ^" N# ?; O
        }               
( @. Q4 M! f# p+ U}
0 S. }# N9 I1 _" }4 [, v2 G
7 S/ ?8 }: G) e. j  D; uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# W/ I5 Z0 d2 _: z  c6 {% d2 \9 q{
1 G0 u* _5 u+ m" L, a5 n        RX_MSG_PROTOCOL buf;* F. z4 [. U9 n% Y8 w
        
! B# v. {" Y9 w, |; e+ q: l        buf.a = pshreRAM->a;
, j4 g* a6 I4 B; Q. F4 w% R) F        buf.b = pshreRAM->b;
1 q: g# y: Q( ?( k' ^        buf.packet_cout = pshreRAM->packet_cout;
2 _) @! o: s( |" ?1 T# v" u% r        , c* N' q$ j7 K$ C: L5 `! Y4 G
        if(buf.packet_cout != count_copy)
1 J! H$ F% o) N  q        {
! v$ l, x2 C7 B6 `, C) J( q9 j                printf("a is %d\n", buf.a);
) y/ l! Z5 D4 p+ i                printf("b is %d\n", buf.b);& C; h. q1 [$ z+ b2 {, s8 `
                printf("count is %d\n", buf.packet_cout);/ r* j% Z; |9 @, l, K5 R6 D
                count_copy = buf.packet_cout;* t1 ~4 h8 i( A6 a" D* W) N; E
        }, z8 K/ ~: D- f6 n, Y4 I
        else. w+ f8 V5 @) G2 y8 z* V  r- T
        {
/ J9 U+ y5 C1 Q% t; y; I) t% u3 q                printf("No effective message!");
8 |* j4 }( s5 q; j- S* h        }$ k& I5 C/ b  v  j/ G
}
7 B/ F5 n+ i/ s, @, w  V8 Z& e- Y! g2 P7 @  H5 E

5 P" z+ y: U1 ]% s% A; y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% j8 _. M, C2 ~( b8 `1 @7 o
使用下面代码,对内存使用了mmap函数后:
8 M1 ~4 _* ^7 |/ n+ A/ {4 M1 V#include <stdio.h>
' }* ?) `1 {+ ]3 g* ^  u#include <unistd.h>
! ^* w# w. S4 C/ J5 S#include <sys/mman.h>2 g6 [0 B& R: y
#include <sys/types.h>+ H# Z( }% ^+ c4 s- M
#include <fcntl.h>* @2 ?+ A+ V: b+ @/ ]! p1 S: s0 f

. N+ Q9 R, k; j8 M8 k#define SHAER_RAM_BASE_ADDR    (0x80000000)6 T. @1 p  R( f9 i0 H$ m7 B
#define SHAER_RAM_SIZE         (0x20000)   0 u( t3 t7 ?/ m1 J) o
& A) r9 p& P* E+ e* R  e
typedef struct
  a. b$ o, A; t/ `* ~& T9 Q) [! D5 H{
; p' q8 t1 a- Y2 R        unsigned int a;
/ T& q) d: j$ f) a( W+ x3 M' X/ G6 F        unsigned int b;) c) O0 d% j2 y1 y: P7 F! O( ]
        unsigned int packet_cout;
' l3 r- T  [7 b/ n; c4 q2 j8 q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 S: c# E0 _- ~1 x' |/ x& ]
& [4 g# i8 |5 f9 l
void read_MSG_buffer(int *baseaddr);, R2 o/ c- H, C9 \8 S7 ]) C
unsigned int count_copy = 0;
. C" }1 n4 Q7 }3 }5 q( o- r; Z; [$ P3 }5 ^8 O$ @
int main()( U& M8 r6 P/ ]* `4 A3 }& U
{# {8 U+ z: d) `- K; N* J! ~8 K
        int fd;; k# o6 u' J: G+ S/ B/ y2 `
        int *mem = NULL;
! R9 r, P/ t/ a  ?* X5 r5 ]/ |3 G4 I( D; P( L
        if((fd = open("/dev/mem", O_RDWR)) <0)
0 ]& L# x' C. y0 L: R        {
6 z% K2 `/ Q5 G$ Q1 U- M# D$ q                perror("open error");( R* R- T0 g# S/ [& l4 \+ K  {
                return -1;
+ X5 m0 [% a3 _$ v  a        }
' o; b- R) u% I$ R/ v- I: G/ l        
/ V  _! o6 o/ d- Z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);  A7 l2 n! V& R* Q9 |) u

( I* t0 ]# U& A5 L+ a' {        while(1)% _8 M  N. n$ C; F# n, I: B/ b
        {
$ G$ X5 W# h; G9 ~# S5 \; ?" y                read_MSG_buffer(mem);4 ]; o; r7 z1 V+ r& D% t7 Z' |
        }               
: _- s( c) x5 u" U8 _& ]2 b7 G: k}5 E& D+ L3 ?5 Y7 o: d& }# t# g( _5 u
- \1 |# O% h; ^$ P/ f
void read_MSG_buffer(int *baseaddr)
5 t% ?2 s; g6 o{
5 Z5 Z7 Z1 i, v        pRX_MSG_PROTOCOL pshreRAM = NULL;7 o. a* Y. S& n: Q  G! I
/ H$ v! r$ R9 Q& d- A6 v) m
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;  J, ~" O1 `6 \
# [8 \% i, M2 B6 t
        if(pshreRAM->packet_cout != count_copy)/ l4 ~' b6 V  F9 g) d1 G' N
        {6 F8 q2 u4 A8 Y1 Q
                printf("a is %d\n", pshreRAM->a);8 W5 n+ C$ T1 N8 z" E
                printf("b is %d\n", pshreRAM->b);
2 P1 K0 E* V* K5 H                printf("count is %d\n", pshreRAM->packet_cout);! Z. r- z1 S/ x/ z) Y& [9 V
                count_copy = pshreRAM->packet_cout;; R* h& W8 p" g
        }
2 @0 {0 f  _3 t5 E, _        else
- }; Q" j! j/ M        {
. }0 [8 Q* V" k2 j/ [; o% |0 }                printf("No effective message!\n");
" Y# F4 R9 H) t6 m' K& G0 X. I        }" n9 K- K8 N* h: P
}
2 r% w$ m( p9 L: G/ a- ?2 \$ I( b! S( P( [5 V) u9 `
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  q2 f0 R! n9 ?. Z1 `7 m; h- S

/ a" I9 y. }: k0 R7 Q
' X' D  b5 d; {6 S; M% K( y  n) r3 U0 |/ p
0 m6 z. c2 ~+ {7 r





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