嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 x* t- `/ ]  A
8 ~7 ~# H1 l3 I  K$ n5 KOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& a5 M7 p. F* ^9 E8 H/ S% w! c0 v
#include <unistd.h>$ j& b% }+ Q  i
#include <sys/mman.h>0 Q+ s) T* l  q
#include <sys/types.h>
9 n. h  s+ K7 M/ C! e, k" G) S#include <fcntl.h>. O3 ?% m$ G6 h

% T0 J& D( ~/ D, J#define SHAER_RAM_BASE_ADDR    (0x80000000)   
7 r* f( B. j  _% t" v) t7 x6 v; M; L6 m4 Q- o! F
typedef struct/ a' E7 {+ L  M" ^; R
{
5 M% f' H% r' ^) f8 R1 C5 ]        unsigned int a;
# C  S3 P1 {  F/ l! O4 \3 Y, W; a        unsigned int b;
' n7 o' {" H5 T% W# c        unsigned int packet_cout;& r: Q# `* U8 C8 B& L: k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, k  Z: y9 f0 g0 ^2 ^8 P1 T- a7 c% o

# d! X3 ?0 N4 c& I7 Mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; _4 e& D/ e, n6 }unsigned int count_copy = 0;
( C& F4 M6 x+ z- Z& R- q- S: T* {
6 |$ W+ X. ]+ M+ [
! _' R8 _$ |( j( k6 Dint main()
7 ~# S3 M4 g8 v8 y3 ?{; n* _6 f- P" Q3 J; ^3 L4 A: E$ h) r
        pRX_MSG_PROTOCOL pshreRAM = NULL;- s' u  m4 y8 I6 o" q
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' t1 n6 i5 w6 _) K9 R. P

, A& |: \; `; W        while(1)
! L. e# p) D! x+ w0 \+ h        {$ U& U# E' z2 i
                read_MSG_buffer(pshreRAM);
, O$ H; n8 X6 H2 B# s7 _        }                9 f/ k; @+ Z1 z1 _  V8 e
}+ L$ ]5 P* L0 Z- T* }9 j
0 Z" P1 A+ R, `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' L$ d3 u: @( }$ P& ?1 M; m; h
{6 ]3 o$ t  n; o3 y- M9 Z7 Z' K' o
        RX_MSG_PROTOCOL buf;
6 k: P2 |$ |4 ]5 w- @4 I4 \        3 a/ V; K( m* c. s  _4 ]
        buf.a = pshreRAM->a;
5 e) v7 s1 k# {* X- B& y/ y        buf.b = pshreRAM->b;
1 F) k! v" K4 y7 V1 j. X8 u        buf.packet_cout = pshreRAM->packet_cout;
. q% `  V7 K& R7 n        
/ P$ F- I5 x3 S. ~1 t, C- Y! V        if(buf.packet_cout != count_copy)3 X" T) C6 \6 @" N6 ^* X
        {
  }: K9 A7 A1 K2 C7 E) e                printf("a is %d\n", buf.a);/ o: p9 K* l' h  n' z
                printf("b is %d\n", buf.b);
/ T: r/ r  W* @* F, b5 E7 S/ _0 @                printf("count is %d\n", buf.packet_cout);
% ?: a# s) Q2 z; i' j$ B                count_copy = buf.packet_cout;7 x  Y* C$ V1 i+ Q
        }
5 F  c' J, l$ ]1 R3 y        else
: _! t- L4 }8 @$ Z% V        {! D2 C, f% H$ w* p3 u3 A
                printf("No effective message!");) w& ]0 k% t% j( E* b
        }
* O$ U' ?; ^% O6 E  S4 Y; G}$ R1 `: n9 v# Z

" b6 b+ r5 C  {& O
% ?3 h% ^; n. j* X- C/ W  x但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  B% c5 x- g* }+ c使用下面代码,对内存使用了mmap函数后:
% [+ l# V& P  O( P#include <stdio.h>
) n7 }) U2 F! p% t- u" Z2 m  f#include <unistd.h>% k% X3 ~$ x( P5 u
#include <sys/mman.h>
; [, y9 c  |6 t) ]2 O6 I#include <sys/types.h>
% g0 u+ z7 J/ F: S#include <fcntl.h>1 k: |) k8 c) q; y

$ a2 Y2 w4 q4 X5 u6 d#define SHAER_RAM_BASE_ADDR    (0x80000000)
# }) o9 c( ?, j9 f#define SHAER_RAM_SIZE         (0x20000)   
  B: g8 ?0 ?0 g( B) k) y. z
+ ]2 e! s9 z3 `, Dtypedef struct! G9 H$ Y5 W  a2 ^: |+ n& |
{
& j  z+ |: p1 }0 a3 z- T        unsigned int a;
" m) ^. H: j; d7 E        unsigned int b;4 s1 `0 F8 h8 n0 T
        unsigned int packet_cout;
- r# p  z( ^- i3 e. H; r; |9 O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; T% O. q$ N& V! H: a1 ~7 W+ {0 ~. {
/ o& o+ ~: O& x" U3 o0 L  y: v
void read_MSG_buffer(int *baseaddr);1 o/ H2 Q) ?, ?4 y! Z- k$ U
unsigned int count_copy = 0;
  J" `9 M9 P5 K! A5 E0 e3 D, U- J4 J5 D. s# A$ T' _3 O& p7 B% y3 C3 u8 d
int main()8 D5 J1 z7 A! G4 c7 a/ ]* x
{
; S8 v; t0 b" z        int fd;
( _, j: n9 O+ O9 u/ X+ N        int *mem = NULL;
4 j+ f. F7 [0 R" ?
# p3 ~% x' b5 |) Z4 B        if((fd = open("/dev/mem", O_RDWR)) <0)
& c7 J7 W3 ~! Z9 V  d2 W, p        {
9 T$ D& @% {' R# x$ T                perror("open error");" R* c3 ]; _8 {; a. b) j+ ]3 q4 W
                return -1;4 d2 p/ x& _- E
        }2 |. h' i5 H, v. G! Y: {2 t( h
        ( p$ O1 a+ y7 y4 r1 M; a8 d4 ^
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" W) i8 _5 m* x4 G2 G  p- W
  k! ]. x# |  G
        while(1)+ q' m# {0 L3 ^" W
        {6 P7 @: b% l$ k3 n5 S0 p
                read_MSG_buffer(mem);
& J( z9 h" e. i# u, d! |        }                - j+ s# Z4 _6 [! N/ J  B1 E
}
+ p9 t6 X8 y7 m( t" g( F# u$ A6 T5 {& A6 d3 _
void read_MSG_buffer(int *baseaddr)$ a6 U0 R8 E, W, z1 Z- Z, `# G
{  z6 x- c9 F! H( r0 [, o
        pRX_MSG_PROTOCOL pshreRAM = NULL;) }6 q4 j& z% w/ _- ?9 P$ p; c

  S. }* {! F; D# i        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" E$ n; `9 `% n2 Z

0 j* T; m. h, N) X: y4 }" x        if(pshreRAM->packet_cout != count_copy)& d( k, X% \3 q! H) M4 b2 r+ r
        {
1 z) f$ z/ o$ S; r                printf("a is %d\n", pshreRAM->a);1 H( F- c  J$ |3 K. r# U
                printf("b is %d\n", pshreRAM->b);8 K. [, _8 Q, H. m5 E$ y* `1 {5 u0 c- Z
                printf("count is %d\n", pshreRAM->packet_cout);9 M2 Y; S; d; t# b7 C- N- _4 L
                count_copy = pshreRAM->packet_cout;( y5 R9 O( s9 p; E
        }; |' O5 r5 f, H- w9 D2 A
        else
- P( ]/ V  Z5 @- n        {/ k% V3 u4 S: D  Q
                printf("No effective message!\n");4 D* s+ a* {- E7 O) l- @2 B3 {: j5 ?0 d
        }: l! ]1 H7 d8 P' f; a
}
9 N- o1 U6 d: F+ Z. s! ^
3 v  r/ b8 `9 H5 `- j0 ~没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" c* _1 T- z. X8 e  C$ ?  \
9 \1 t' `  ^9 m# N: `4 t
( D. s" y) H' |4 |& g( [( e

2 c  }9 ^) J, _9 D
1 v" I- p) ?$ j8 [




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