嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 J0 X9 r- ^( w4 E: c0 O7 }, K

/ B' U& i$ {5 ^+ X0 Q1 A2 EOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# u1 ~1 @& ?; U& [9 @#include <unistd.h>4 T1 V4 \. y7 I# [8 A: V
#include <sys/mman.h>
2 b2 C& ~3 V4 o1 b( o- W#include <sys/types.h>
7 U0 R4 p8 R- H( W9 @#include <fcntl.h>' x. ]' Z0 h2 P$ P% |' r
& n' y3 \& @/ N! ]0 H& I
#define SHAER_RAM_BASE_ADDR    (0x80000000)   " C3 o0 a1 G& G# S3 n8 F$ o
5 g4 l7 ^2 q; t  _
typedef struct  `' G/ D& a: U/ a, r/ i
{9 t, O/ T3 w& [  }
        unsigned int a;
) P3 S7 p$ C* D2 J" t) O, B' w        unsigned int b;
7 o& o* V2 F4 w' w        unsigned int packet_cout;0 _% z2 w5 k- j; D% t; p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 U7 n9 z% l4 B2 ^+ @; m9 ?, d0 u# @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" _8 D3 U, T8 ~7 C5 Ounsigned int count_copy = 0;
1 \+ x4 z6 e" ?, _3 u# O
+ L! M. {* L8 c# }  D3 p; S1 K! T5 H% z0 G" m  m1 y
int main()1 `# h. x4 @! x& r% I
{
, v! X0 R8 m! z2 C, H2 f0 G1 ^( |        pRX_MSG_PROTOCOL pshreRAM = NULL;
) d$ `- S8 k/ R; s        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' f0 L% R8 y: X% I
  Y0 B1 ~7 K5 E: a- o
        while(1); H, A+ k* I4 O# \! C1 \7 @
        {
2 `7 k% ~! V/ |  {& x                read_MSG_buffer(pshreRAM);9 I8 E1 D' @% b( n. N
        }                , e/ a# ^! o( _0 y
}
8 q$ |) ~- v3 I3 ~7 n( z7 v# l9 q' V/ r$ }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( e" i4 Z3 V( }. J* L% }
{% {9 S+ r. L5 _$ N" R9 ?4 ~- j
        RX_MSG_PROTOCOL buf;
1 z2 G( H+ \, n7 x  D* J, ^% ^        & }/ g3 W/ p$ U9 ^7 c, C  s" k
        buf.a = pshreRAM->a;
( E2 B0 N' F6 F) D) \' n) z        buf.b = pshreRAM->b;1 @( I1 L* E5 q! a
        buf.packet_cout = pshreRAM->packet_cout;
" s# Q, d8 e( E: j, d        
- P1 ~: C* l5 V) f: E        if(buf.packet_cout != count_copy)" y) B4 j7 ^0 G, S: \( J
        {: F# M5 y8 v' Q4 D$ u" q
                printf("a is %d\n", buf.a);  ^& L0 c7 U& N; a- @% P- u' [
                printf("b is %d\n", buf.b);
8 Y6 ^, ^# O3 ~6 u2 C                printf("count is %d\n", buf.packet_cout);
7 A- ^; N* g5 f                count_copy = buf.packet_cout;: R4 n: A+ @8 Q+ _( j* y- y; J
        }/ [( g& O/ C, W# g1 {
        else9 c9 y5 O+ P* r0 C; Q' ^5 X1 R/ H
        {3 m) a! a8 L. [2 _- p% \
                printf("No effective message!");
) g- ]7 R$ I4 \! A/ Z1 @" e        }
; P+ k9 {7 w2 ?3 O/ C}" l8 j2 Y& f, k, d% R
* V9 Y# e" [1 ]7 p5 W+ E5 O9 O  D9 X5 G

$ s' ?! a9 F0 `: A: h但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' l& V' j* r2 h+ l# m& c1 U% F1 [使用下面代码,对内存使用了mmap函数后:0 G" c9 i" O' Y! l$ _2 _* Z; x# |
#include <stdio.h>1 d7 Y& w# b/ A# }
#include <unistd.h>
3 Q) A3 k" z$ I# F1 z9 ^, s2 d4 v#include <sys/mman.h>
! ?8 h$ X  q. s& }8 l% x  L) w#include <sys/types.h># ?1 @3 s, {8 R1 ~5 }
#include <fcntl.h>; @8 X; W2 y5 {0 ]# Q

" C! z7 B9 s- k# O% ^4 ]  u#define SHAER_RAM_BASE_ADDR    (0x80000000)3 M. }5 R4 P, {9 T
#define SHAER_RAM_SIZE         (0x20000)   
$ c+ N* i+ I# _6 c" \% ]+ E% Y  Q  F5 I' E( Z7 x; U
typedef struct
$ I8 W0 W, {1 Y. V1 G! _% [, r5 U{9 U/ |; R. [9 M, ~! e
        unsigned int a;
6 w( U6 m, g8 r0 R& B6 S        unsigned int b;8 [& j3 N# `9 f
        unsigned int packet_cout;
/ o0 [  m2 {5 i8 u}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 k% ]  W3 M1 Q& g, k% V& j$ V# W8 r! n
void read_MSG_buffer(int *baseaddr);+ U& ~. }: q, g5 \- I. C
unsigned int count_copy = 0;
- M: C; {$ A  E, Y# i
5 ~- p/ T% g. ]1 h8 _6 a8 {int main()
* S, g! I! S; D# _) C: F{
$ h' m+ R# N2 J* G& G. U        int fd;  K6 X+ g+ p8 N) o2 @
        int *mem = NULL;/ E/ ]# k: x1 q7 z" H

5 [( b" M3 J7 g8 Y        if((fd = open("/dev/mem", O_RDWR)) <0)
: z; T  _" k# t" i) Q4 n        {1 G7 ?/ ]+ ^+ j  I% H$ _
                perror("open error");/ B; Q3 r: D+ F& v  e, d) u
                return -1;. X* l7 g/ v7 S' n- ]* X3 K/ O
        }9 |4 v, z% U# ^$ r, ?& W1 J2 e# v( C
        9 s' c' w4 d! V8 F- ~8 n( j
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' x! N  D- E$ s6 y5 Y" ~' z

; V& n& V% }- w  o/ ?        while(1)
" s# V( \( Z! j7 x, R" b/ D+ x        {
! k( x, o3 r) U$ s9 @. V                read_MSG_buffer(mem);! ]4 q8 P# v$ ]0 x- e4 ~4 x9 i
        }                5 G( z8 g' G4 t2 V" C# M5 p
}" X) w$ V) G) P5 F$ b
% T$ C. ?1 ^: Y% ~1 F# R$ V
void read_MSG_buffer(int *baseaddr)
: D- P! L$ o, A, |6 W8 t{
; ~! D* u6 l. H, ^        pRX_MSG_PROTOCOL pshreRAM = NULL;
" e% a% U) T3 r4 |
6 v( z0 d" T. F/ \8 g        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 }4 N: E# X; _
. g6 A9 M+ }) g8 G# w- R9 D+ w
        if(pshreRAM->packet_cout != count_copy)
/ k( f: D' x0 t/ ^        {+ d5 G& K7 @+ ?: l; W
                printf("a is %d\n", pshreRAM->a);$ y/ `0 J# ^2 p& y
                printf("b is %d\n", pshreRAM->b);
& \. M: t& {; R8 y# ~1 w                printf("count is %d\n", pshreRAM->packet_cout);5 }! ]& _% Z( x- u3 m
                count_copy = pshreRAM->packet_cout;
+ G2 t: X$ u% ~$ T        }6 Y8 [/ D  d  b* G) R
        else
$ Z9 v/ ~1 R! [1 K4 l        {
5 i. Y5 m& _+ I: f0 Q                printf("No effective message!\n");' g) ?5 p" u- `4 ^
        }6 s+ n/ Q5 V2 k2 I) ^
}
# w! {1 ]# w0 p3 z+ T
- t% G& v( e8 \6 {7 F: b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: K1 y$ W3 P1 B' j$ b
' \6 E7 q' |3 ~9 W# T. {1 q) @% P" a) R

6 P: E3 U& M( u9 E3 l6 o, \
& ]9 @& ~- P  S5 {# @




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