嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑   C+ t# ^" o6 X& D
  X' P4 A3 O+ J( v+ `; D7 \
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! v9 ?4 M$ ]0 L; N) j% ?4 }6 s" l#include <unistd.h>/ x; ?  V% T4 y1 ]' @
#include <sys/mman.h>
; p# P+ f$ A' q& D8 F#include <sys/types.h>* }4 r5 a7 p# o7 I
#include <fcntl.h>
- H8 `/ |1 r7 G6 ?- s
! [1 s3 v5 G( p& D#define SHAER_RAM_BASE_ADDR    (0x80000000)   6 `$ m0 u+ K. k# ^, c' ]
4 Z. Y# J: I: j( Z/ D/ L6 |2 Z/ I
typedef struct
4 T0 A& M5 ~8 a; u* v4 D% ]{
2 C2 k' L. `9 s+ b& i        unsigned int a;
3 D3 Y, E' a! A0 b6 x0 R5 U; d        unsigned int b;
6 ]: c% C4 N6 w        unsigned int packet_cout;( R# A- U2 u% j3 |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 W% @. R$ e  u4 J. g, n

% S: M3 u+ a2 Z7 v- _. [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 i7 e9 u3 F7 n; ]5 n( Nunsigned int count_copy = 0;
0 I& U+ L; ^# A' E& |* b2 k& J+ v) R3 b
% Q" F& x8 z6 s5 j; f! _+ O
int main()
5 p. v% V, W! {' c$ K% t- }{) o: O) i- }$ v& i
        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 ~7 I  Z; ?5 K        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;6 ?$ Q$ q  ^. T3 ^6 R7 L
' q6 r5 g! }( P( }
        while(1)
3 M9 V/ W: ], @  W4 h" K        {4 _: o* {- u/ k  c! n
                read_MSG_buffer(pshreRAM);/ r0 s8 Q$ ^! O" D1 v
        }                & G4 `' B! {( N0 R/ x
}( L  n( A) U3 e# R: D" R+ W
4 r" x* B% h/ X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)  W8 w% w) D9 B8 s8 m- J) {
{6 K; H1 k/ b! r9 A1 k" R. o4 n
        RX_MSG_PROTOCOL buf;
/ \5 M! G+ e1 |" s( Z# b        
1 g" ]. [  P( S6 L1 X" f        buf.a = pshreRAM->a;
! i  U) E6 ~; }        buf.b = pshreRAM->b;
  _0 V5 Q* D  S9 Q* `( \        buf.packet_cout = pshreRAM->packet_cout;
) B5 Z: _; ?! Z        
& _6 ?; d4 _" D. ?        if(buf.packet_cout != count_copy)
3 k) D9 \6 Z4 K3 C+ U; [) }        {
- J9 `' `- |- n  T$ P8 O( s0 a                printf("a is %d\n", buf.a);' ?) A8 Q% j" Y
                printf("b is %d\n", buf.b);
5 @. @) `4 y  K                printf("count is %d\n", buf.packet_cout);
  @+ L: J4 e7 ]: j                count_copy = buf.packet_cout;  s1 B" A% f# W: u. X6 C8 |) z
        }8 z8 j3 C# H! L! B( @- A
        else
4 J; ^7 W4 j4 j        {
9 q, a" L; h( ^  C) [" h% B                printf("No effective message!");
6 `& Y6 `9 Q( k( ?. I  O        }
: r" |" e& V" A, x6 `2 _}  C3 I# T8 r4 t& I  q

* M: ^2 A; f- G$ ^7 V, q* n
9 Q  I  O! S& i% Z* Q2 w" |  x但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ L6 l  q) K# A" s7 n
使用下面代码,对内存使用了mmap函数后:$ r8 q4 ]3 T5 s' f3 X
#include <stdio.h>
& g, h0 j- P1 [3 B' K#include <unistd.h>) X  Q0 {! Q, @# G" b
#include <sys/mman.h>, P3 @5 u# b1 o0 T" |, {. l3 J
#include <sys/types.h>4 @  E. x* {. v) s2 ?2 P. X' E
#include <fcntl.h>
) W8 h1 A9 [/ N. i4 Z4 I2 h5 g4 ]& E
#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 E+ y% M$ E, H: h0 |+ Y#define SHAER_RAM_SIZE         (0x20000)   + I6 ?: |( u5 K- O0 T* G
" k8 I& u7 W4 [" o7 b+ |' i
typedef struct! o7 ?# Y) H# N; ^; Z
{
1 c) q" A0 K* K9 l/ v% ^" a9 V        unsigned int a;- N- F7 V9 \, c( D9 T% y5 M
        unsigned int b;. x( i3 z) y% ^7 Q2 K! G
        unsigned int packet_cout;4 m" L" z! O2 z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, ]2 k. U. Y7 D: F% p6 ^' a4 b* z
void read_MSG_buffer(int *baseaddr);$ s" _+ Y/ x1 Q/ R# L
unsigned int count_copy = 0;! p/ k4 p: i; `) n9 e
7 g% J& ^6 o$ |$ c  Z' @+ r* H# b
int main()
1 d- |0 ?) ~, @* s6 o4 S5 C{  |7 d+ x( Y$ b+ I+ k2 P5 b
        int fd;
# h" B5 j. y3 P5 a6 v# c3 ~& j        int *mem = NULL;7 e, p; e' D9 Y8 U

, x( W8 |  I1 k7 W* N& O8 O        if((fd = open("/dev/mem", O_RDWR)) <0)
+ }7 I2 X2 ]& n! o        {: G9 p5 u8 [+ b: ?$ W, l8 L
                perror("open error");! U3 M# Z+ _- _% w$ R3 }6 L
                return -1;
4 ^  K. M0 [; O, D! F        }2 V0 t: |+ W1 U% W) K# h1 g: P& F& c: O
        7 t8 g+ M1 t; d0 l* b
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 R' Q) K% Y" X( G5 b: q/ ]% o& e% ^0 x! A- L
        while(1)5 J6 T; _. N- Y2 h2 |8 F
        {
' C+ U3 i; A# K3 [                read_MSG_buffer(mem);
4 C; \  k: _1 y3 \4 T        }               
# o7 j4 I# e# v1 z- p) U}
5 D' [8 I. ]: O$ K; A
# K0 n* a$ K3 N! J( o, Vvoid read_MSG_buffer(int *baseaddr)9 r  i( r  v( t- `* W0 z- r# \
{2 L, r- J- G. R) n) j
        pRX_MSG_PROTOCOL pshreRAM = NULL;
; V9 Z, r) D) |5 O( ?  \1 B8 j' r( F6 \4 l
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  Q5 y1 m8 D5 Z  m* q& _
4 V& q, m& H9 k% a: m        if(pshreRAM->packet_cout != count_copy)
8 j! T5 o1 q% t. i- f% q3 H        {6 t+ v4 ?; W# c- _0 ^. e* P
                printf("a is %d\n", pshreRAM->a);
  U( ?; w' c2 ?" @9 A5 V9 p                printf("b is %d\n", pshreRAM->b);
6 P5 F4 l" x+ I) m5 k. H6 Q3 y                printf("count is %d\n", pshreRAM->packet_cout);$ g1 N+ h. }, z1 I; ?
                count_copy = pshreRAM->packet_cout;
4 L+ Z3 _! U& z3 D6 j$ {0 u. n, h        }7 x5 e% n2 l) B8 x8 h
        else( n, I" c+ i5 ~. ~
        {+ P9 G6 d8 C3 l# _0 G. h
                printf("No effective message!\n");/ n% P$ x+ S& U0 b5 g8 \& \6 a0 G$ V
        }
- H" i8 [% M; v( l! A  F3 ^$ w}
: D$ M% Q7 C: z# M
  }% e7 ^  q* c- y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( `# H' `, |! [4 j5 j$ m

0 P+ E5 p4 z5 l* q' G3 E; @
& P3 A  ?7 p/ f8 ~/ q$ O9 u. H
0 ]8 r; B2 h; y! r1 n( n3 }( [( M) X# }* x6 O" ^  A  @





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