嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 c6 T) u! G  s
  v, U9 B% o5 n0 G7 iOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! j& i3 [+ }7 e2 y
#include <unistd.h>: K, K3 u+ u0 f: T: o' t: k. t" n
#include <sys/mman.h>
4 Z/ L8 S# }: l4 a% z3 J#include <sys/types.h>( ]/ x  x! q  e; h* _* g1 D* e) c
#include <fcntl.h>( ]9 E  l2 E% d# l: p( k: t

$ f0 `; g+ Z5 K1 |#define SHAER_RAM_BASE_ADDR    (0x80000000)   ; `( ^  H1 V2 ~) o7 O
: \# a: H1 M1 n+ s
typedef struct
8 k% A8 \( Z: n, u7 g{
/ N2 i6 K3 \6 m( s8 G) V        unsigned int a;& y1 ~. e7 ^- n# O9 g
        unsigned int b;
$ }' B. L- M- v; S        unsigned int packet_cout;9 i/ y0 A* M& ^1 j0 D% R! B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 V+ ~' N% k8 V0 d% N4 F$ x$ D6 Y! y% i+ ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# k0 j% @2 Y. Ounsigned int count_copy = 0;, z- k+ }0 z+ S- N/ {! H0 Y/ G
4 a1 Z' k  X  K5 z& G. G

9 ?! L; s# a- Y$ ?& iint main()- r: V2 P* w7 Y4 a
{0 L( N$ F' J3 a1 Q! A6 o+ _7 D
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# d3 E0 v9 J/ W: b: K, B! ]        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ Z7 R/ d' w, z8 v- X/ l8 A+ Y' _& X
% ~, _8 K- \2 i
        while(1)+ I& V* o% ~8 ]
        {
6 }* ]- [! _4 G4 N0 o- Z+ Z, d  Y                read_MSG_buffer(pshreRAM);
8 M" B4 u0 m$ a6 N& B5 [, O' e/ t) X# Z        }               
  {: n* b) w8 D( k}
* k. r6 c7 {" ~* @+ V% Y9 d  w% \) O8 r2 {2 _6 ^( ^  m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 P) r- B! G0 Z: e
{1 f7 z" C$ m& a8 o# P4 L( T
        RX_MSG_PROTOCOL buf;7 b% k( ?& x* o
        
! g* N' b/ u8 ~6 U+ q/ v( _& L; \) l        buf.a = pshreRAM->a;
9 j7 _/ t; ^% H9 `        buf.b = pshreRAM->b;; c  C7 h' K" G- I
        buf.packet_cout = pshreRAM->packet_cout;
/ J. E0 X  r/ w0 _        
3 ~) ]: Y% L- G0 x# c% v        if(buf.packet_cout != count_copy)+ G! I+ b( }4 }
        {* [, y* b% T6 s0 c
                printf("a is %d\n", buf.a);
; E7 r  m( N7 |( ?                printf("b is %d\n", buf.b);4 }7 p6 @' X$ J) v
                printf("count is %d\n", buf.packet_cout);. a9 j8 d  |# _- q  F
                count_copy = buf.packet_cout;
0 |+ [. T4 s& |, [% G# y        }9 ?& y2 j7 k+ W, P
        else" i" m" K& G8 \9 w
        {
4 N- _( X- F- P! W                printf("No effective message!");
3 T1 _' G: O! G, }& H        }+ p; `1 F5 `- c3 h& b" R
}  s5 O% {0 m6 S) ~5 f3 S
2 x3 ^0 B5 S  a

) H6 H% v. A- ~- d$ L& p  n但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 @- B* z* i+ V9 G( W5 K/ E, w; ]使用下面代码,对内存使用了mmap函数后:9 Q( N: I# s9 d  U9 B8 b: Y
#include <stdio.h>
8 t* [; n* a$ d1 Q* [$ C#include <unistd.h>% D1 N1 v* v5 T% h0 O
#include <sys/mman.h>
3 U3 X6 r/ `  m1 K& D4 d9 H) p#include <sys/types.h>$ O% Q& t  P- M9 ^  }0 i
#include <fcntl.h>: T: J5 q* P9 Y9 y6 ~5 E1 W# Y

+ |4 P- A. x+ S% ?#define SHAER_RAM_BASE_ADDR    (0x80000000)
  d! ~/ @2 @/ J9 o" `) g- R! U$ c; p#define SHAER_RAM_SIZE         (0x20000)   ' g& \5 `2 _. H6 o" H
  D6 I3 a5 N. W3 B, Y' t- y9 z9 z7 p. C
typedef struct
" ~3 `. m+ H7 g{
2 O7 o. F( L$ Q; P8 @        unsigned int a;: U( c$ L. [/ `+ S2 L5 ^; L
        unsigned int b;! o, ~8 }* S# e: A0 @% ~
        unsigned int packet_cout;
( k  y! C) `2 @5 t3 E1 s" _6 b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. ]0 U9 w) |, Y# }! v# `
) W1 P7 [0 J7 c& A5 [: y: a% d2 B. R
void read_MSG_buffer(int *baseaddr);
8 n4 J; F0 t& n+ Dunsigned int count_copy = 0;
: c0 n! \" Y. P/ O3 s8 }
) k% G0 ~$ L+ Q' M+ E- Sint main()
9 l- P) v5 V1 B+ G/ w{
- g$ A$ [" U3 x0 N0 t4 U. [        int fd;' h6 }' M' y# f9 ^1 |) q' x
        int *mem = NULL;% R" k3 ]: a; X) K. ~) s1 F
* R6 x* Y/ z# l' k8 [! c0 B
        if((fd = open("/dev/mem", O_RDWR)) <0)0 {9 O8 c( Y$ s+ w
        {
  b/ X( n5 h# m% R* K                perror("open error");
9 Z$ b; i1 H, |4 p8 m) V5 T                return -1;6 s5 H9 y1 {" N2 y/ {5 \2 Z
        }
+ s: w7 J1 y) I, `        
/ u5 n+ Z, N; h, [0 Y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 a/ }& J) x% v7 H7 ~

. G5 F% J+ F$ M3 Q7 F        while(1)8 @* x6 c1 r) e1 [" |- L- ~) H' j) z
        {
1 b! U5 w$ a6 m) H! q  D7 J6 C                read_MSG_buffer(mem);
8 [6 h8 g, _4 T' E        }               
; j- t1 M; h$ t/ ~* t- y}) ]+ r5 ]! {) g7 U0 B( t' |

1 G0 m; T4 C3 e) kvoid read_MSG_buffer(int *baseaddr)
3 P/ o8 `7 u# L/ o4 G5 Z% r{0 k7 Y: m) C9 t2 h5 b4 p
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 x8 ~+ J) C) {. G5 X& n( P8 u
' r# n% x  d7 \0 p0 S/ h
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 a, A  |9 F0 u1 J$ \- z
! t! L$ W6 Q5 s        if(pshreRAM->packet_cout != count_copy)+ c: o. _! q! s5 a! Y' T
        {; ?' W% b3 v( x* [  _; I9 K# \
                printf("a is %d\n", pshreRAM->a);% Z- Y! q# s( B5 b0 f9 }8 Y9 X
                printf("b is %d\n", pshreRAM->b);5 \! B' r: q  \; |
                printf("count is %d\n", pshreRAM->packet_cout);4 C2 i) r% `8 ^& I/ C& d7 H
                count_copy = pshreRAM->packet_cout;
3 p2 a5 F0 R# }  R; P        }# p" Q0 u$ b+ j6 Y% x
        else
% L. K3 i7 V$ ?7 e: p# H- d/ Q        {
! \; C4 l2 d2 B" I3 f                printf("No effective message!\n");
. L, I+ t( h+ M: d        }2 T' F; T) }( S9 |$ P# R
}
) G. g$ ^( y: p9 G6 u9 x  h  X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 f' m% H8 \9 Z! k1 z" {. T
4 A, [7 q+ h9 q8 _
1 O. ~/ a5 n* N" X; j
8 m. Y: U) q+ d+ Y! C1 _# P: |4 r' S3 ~1 `0 J5 o# ?3 x# J" d





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