嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + _! \7 y5 [2 G' i- f2 m2 o
/ z6 N/ I9 P) Q- ^3 k1 t1 y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; I7 `7 B$ b0 G" X/ _5 v
#include <unistd.h>
2 P5 [+ `* Q9 W; O- o. t- C#include <sys/mman.h>
% K2 C' F5 h( W1 H0 ^#include <sys/types.h>2 H8 \4 E8 C- D5 @
#include <fcntl.h>
8 \4 F+ }" H; k% P) l/ `% m" L, Z0 F; c$ b
#define SHAER_RAM_BASE_ADDR    (0x80000000)   3 t; h5 G5 m: s# Z0 `
# m3 H6 W( b  |9 j
typedef struct. W/ V4 T3 Z% m, K
{
5 c% r+ I% F0 X        unsigned int a;
7 Y& ~9 L# Z4 C% U) ], U, b        unsigned int b;
. ^) Q" n) `0 X0 J7 b2 y, h        unsigned int packet_cout;' y. G1 ^6 R4 l1 r9 u% X$ F- t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) e# e" [  d! `, k% O% _0 @' j; }( o( L% B0 s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# T0 A# `* ^6 x2 r+ Q1 w" E1 I6 {
unsigned int count_copy = 0;
6 `* B( c1 t' E- H% h8 I$ [( M( w! j$ L: Q* [$ W( b

0 X# x- t: H& R3 M* U# F+ c* [' sint main()
; ~2 E4 e. O; T4 }{9 }/ A, L- T8 U1 Q; t5 e
        pRX_MSG_PROTOCOL pshreRAM = NULL;: h% J% r5 G" X: Z' v4 F; \6 ]1 p
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 k- m. I  F" n  ^. N4 G8 U; o/ p: `4 i

9 r0 @1 Q& i) L* ^- c2 D        while(1)
. k7 v4 e6 L9 K        {6 r4 C3 i: h# m
                read_MSG_buffer(pshreRAM);
# c/ D$ }  h2 [, |% T        }               
3 b5 Z/ [7 s$ E/ {- I}
; k. d. [* N7 }2 z, o
5 Y" a) _1 Y- H, H, s* {1 s1 Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 v* ?+ p  ^& ]) n0 P{
) ~' l/ g7 e* a( O. A3 f        RX_MSG_PROTOCOL buf;/ f4 B9 M* t! f* e% L
        
& c# _( k  |+ U7 a. s5 |% o4 E! L        buf.a = pshreRAM->a;- l7 ^, Q$ l/ G' i
        buf.b = pshreRAM->b;
9 J7 y4 p% t9 j1 Q5 L) S        buf.packet_cout = pshreRAM->packet_cout;8 f2 {9 n  Z5 A2 x( N
        
9 }. u7 x" R0 x4 f        if(buf.packet_cout != count_copy)% K) N$ ^+ W$ Y# H
        {# X- e$ q) k, Z7 T2 D+ `) @
                printf("a is %d\n", buf.a);
% I, s& A: U- U( p6 O4 |9 }& b, m                printf("b is %d\n", buf.b);
( }2 s  c* R5 d3 Y5 H+ ?1 t                printf("count is %d\n", buf.packet_cout);, F: z, \& C( R1 \( W- \( C
                count_copy = buf.packet_cout;4 H, ]; e3 \* \4 e; |8 @2 v
        }
8 Z% i  f/ O9 Q        else
" k2 X$ e" x: m4 G        {
0 m; }1 V6 H+ D  w) ^: k                printf("No effective message!");5 ]" h9 G9 w3 k% k" N& l1 Y' h
        }1 ]/ r2 S; q2 v; e. K3 }7 V
}  [* K1 ?6 ]) t3 i) }- r  K
6 ?( d$ l5 \* m2 \, D& i
3 U  k& ]8 e: i* Y+ H( ?2 \# d$ N9 N
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ D, Q% i$ b- N* ^使用下面代码,对内存使用了mmap函数后:
: L  ~6 N" ~+ b$ r. W#include <stdio.h>) g) U) K3 u/ F( F: T  o
#include <unistd.h>
. z$ |1 W; U9 L4 p) c! W/ ^! w#include <sys/mman.h>
. j4 D0 ]5 K# z1 g- K#include <sys/types.h>
4 X! a! f) o" I- K/ Y! e. P#include <fcntl.h>
5 }/ O5 ?# m- G+ D  ?( C
. K* r' K3 W+ z! S3 a#define SHAER_RAM_BASE_ADDR    (0x80000000)
* V$ ^; g& k& e- s+ y; W( N# R#define SHAER_RAM_SIZE         (0x20000)   
% {: ?* a& w( h2 b. J3 M2 z& p( f1 g
* ~& @1 x: J) O1 w3 M' u  Ytypedef struct
+ e! `8 B+ J1 T{0 \* I% F7 _  `0 B3 C7 i! }! r2 I
        unsigned int a;
( E7 T& P- m2 v( z. y. g6 L        unsigned int b;! W( D. Y7 M7 o& U
        unsigned int packet_cout;
% h  F/ h4 y  {" v) D+ b$ a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  }* _% [  e. Y2 K5 c. W
8 R* }4 f& }/ z4 [  h* Q/ C$ d
void read_MSG_buffer(int *baseaddr);6 b% K; u# y  g; z2 }' d
unsigned int count_copy = 0;6 X- T, L9 H! t6 V, W

3 g4 T8 r8 E- K7 Rint main()
# i9 b/ |( O- C. b{
$ d% U9 ^+ O  s2 r% i; |4 r& y  g! L        int fd;) M: K7 \9 p4 T9 J1 F6 u
        int *mem = NULL;
& k$ F9 t1 ?9 u% X  P
" v" b2 W( k0 e' A% s. D" S        if((fd = open("/dev/mem", O_RDWR)) <0)  {4 r- E; k9 Y% N$ t
        {
5 l. ^! p6 \; m$ U                perror("open error");' T0 S7 o2 q& B, O% d/ Z8 @
                return -1;# m, o' J! R( e# E
        }
9 U$ g% ~' Z+ m- @' i        ) H7 S/ Z/ p4 u: q. F
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; z! m$ N# V2 F' g5 d7 V# k+ o" b6 S. W( R7 u. _5 d/ `. A
        while(1)
+ g4 G! W* g2 K& h; D' n9 v        {+ m/ }: n, ~4 L4 M3 N* B
                read_MSG_buffer(mem);4 ]3 n% ]" D6 N/ \$ _
        }               
0 H0 I) {2 U% }. g+ G  _) I7 ~}! g# c# _) A. L

" U* ^8 Y% v: Qvoid read_MSG_buffer(int *baseaddr)
8 a" L4 \2 B9 n1 m+ V+ C' g- P{
& L" ]3 \* m; I        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 v, M  B4 r" Y
" r9 E! {) o* {' e: `        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 `  `" _# \. p$ F7 V& ]
! _/ M; f$ `. V+ q        if(pshreRAM->packet_cout != count_copy)
$ P* i% A- x! P8 M1 p        {3 D, w! J- S9 y+ e
                printf("a is %d\n", pshreRAM->a);
  V  c$ c$ P& g                printf("b is %d\n", pshreRAM->b);5 u3 j$ L  W9 W5 R+ ]" q+ p% ~0 Q
                printf("count is %d\n", pshreRAM->packet_cout);
2 ^$ X: W, K0 J& E6 e8 T                count_copy = pshreRAM->packet_cout;8 Q( H" y, h) u# b5 B2 ?  C  Q
        }- l. v$ r7 H% \5 B, P3 O6 o+ y& D
        else
+ Q8 o& t  @* X! H& g; b2 q        {; m& H# B# ^/ S( C
                printf("No effective message!\n");
( j9 O6 c) M# E- S  Y        }0 O1 o! w9 C6 U! V
}' k+ f+ d" v2 R- X

% u! I5 c7 a6 d% k: R+ I没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" L0 d- S! k* J% F. i
2 _! R; z, M1 i' t
2 M, q5 ^$ Z+ b- \, K5 y( c5 s; S9 }4 w2 J

' f& g! Z) z9 t& C




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