嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 c2 R" B3 a) b/ h9 K' k& a# ~9 Q4 N0 S, `* D- Q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* K9 Q  x1 b7 W* `" u$ {# W0 x  o#include <unistd.h>, n0 u( A$ Y: J* `* C; T
#include <sys/mman.h>
: `- Y  F' A6 L" n% T  F0 s0 P  F#include <sys/types.h>, u0 z) I8 I) K
#include <fcntl.h>
& M- a8 {; v0 o/ [, ^. i+ R8 Q7 h
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% j# S% S' u$ m  y5 z' W" h! b  {% C' ?  }/ U: e
typedef struct
! J0 y* U" ^- R/ \  A, T{" Z. `  V% Q! g( p+ c5 T+ V3 W1 X
        unsigned int a;
6 f. P3 O" }4 e, H        unsigned int b;
7 n$ x7 @* Y4 U4 s        unsigned int packet_cout;
! Q; \& c2 X( |2 v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 J' F: O8 N" j, w8 p

0 v& F0 I9 m, u' M5 Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 }0 t3 F4 _9 p- l( hunsigned int count_copy = 0;
: Z# B4 b; r7 d* z; [5 G% M- c( T2 M! N! M) Q9 z
. w* o1 R6 a# B; }
int main()! d3 H$ K6 H, A  A
{( l5 b% Y8 q5 {' g" d; I! Z
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! C6 Z5 H) w& i7 i- {4 o        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ u! B1 A" i: w) m# x, p5 K: [: P1 [8 c  Y
        while(1)
7 F# t9 y: h& ^2 _* C" a        {
( {7 T5 R9 [& F- A2 V                read_MSG_buffer(pshreRAM);8 ]) X) z; N3 V' B8 {
        }                " M  ~9 q. E+ ^  u8 j. S+ S
}
+ i" m7 y( |& L9 q7 W* Q  r" k0 e- y8 k% K  u2 x* \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 n3 ?; N0 m* ^9 ~0 {0 s
{% B* f; o: A7 D! w! A; a
        RX_MSG_PROTOCOL buf;8 K: e+ M0 \3 ], h0 l! u+ q
        6 M$ Y, s4 w2 f4 q" S+ F* p' h- T
        buf.a = pshreRAM->a;
' X# I% T5 S2 J$ i/ G        buf.b = pshreRAM->b;/ Z# L7 j. ^. G6 J
        buf.packet_cout = pshreRAM->packet_cout;( s( w4 d& ~, w
        
+ B. a# g* B2 J) W' o        if(buf.packet_cout != count_copy)) q% _( h, w# x+ ]0 t
        {0 I' V) X& m4 C) ]
                printf("a is %d\n", buf.a);  |+ @" E/ b9 f2 |4 p) q
                printf("b is %d\n", buf.b);
$ w/ l' Z, P' e  J% y! O                printf("count is %d\n", buf.packet_cout);9 B/ B& \" D! l) B, K6 Y2 L0 {
                count_copy = buf.packet_cout;9 l. ]. T% L; ^  T2 h) f) O  b# E
        }8 R( B, E. w6 M$ j3 t+ N3 K
        else2 c4 o2 a1 C4 u# K5 l
        {% ~; }) ~" P. I0 P  l
                printf("No effective message!");
# f0 f7 B! o/ m8 @. w7 x0 y        }
& n( _7 ?- L( C8 C* B' H% b- h}  U" O$ _8 M+ q% x/ e# r# R
, n: F0 E- R# Z0 T5 R: X& t

' ?. a( Y* j0 r4 u但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ j. `! w9 V+ M使用下面代码,对内存使用了mmap函数后:5 M3 G4 [  K/ E' |3 ~. H
#include <stdio.h>( l0 {) p5 c0 ^- l+ \2 z
#include <unistd.h>. @. R9 h% U5 u
#include <sys/mman.h>
: K  c' f) J% v* D0 Y( t#include <sys/types.h>1 t$ d3 O, l2 L- D
#include <fcntl.h>0 x4 @& B" T% G- Z: U
3 j3 b% \6 A1 o+ i, s, w8 m
#define SHAER_RAM_BASE_ADDR    (0x80000000)1 J3 A% S: c1 H( u1 X" j
#define SHAER_RAM_SIZE         (0x20000)   - s9 F2 a! T# u- I* r4 Q% r9 @
! o5 I& F1 ~3 d( D  d; K- L+ C3 w
typedef struct, p5 W5 f+ l" M. C8 {
{
  S: R. e, S5 P        unsigned int a;6 a- V, d8 p% ]1 e9 f7 v
        unsigned int b;
" J9 R, W: z# j+ o' H        unsigned int packet_cout;
$ ?2 d% ~. s8 \) {, W" z# x, I}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; }% h7 I  d; Z! q# w7 E+ z7 X4 h2 K# c( q9 L1 v% V1 o: f4 [4 Z, N
void read_MSG_buffer(int *baseaddr);, w& _8 N6 P* ?9 ?
unsigned int count_copy = 0;
- U; |- s+ L3 }
' w8 W( J( a: P( j- p* vint main()
( U) z4 }+ \$ D' p& A4 p{9 Y' v$ I  I$ [8 K" o
        int fd;7 @  P( N, Y( m- o
        int *mem = NULL;
6 Z4 i: b4 f/ }/ b+ S. j, ~7 Q, ?6 T% [( y' L' S
        if((fd = open("/dev/mem", O_RDWR)) <0)
7 W* m2 o, O. s9 o' C1 p        {
/ q! C  U* g6 m. _# l                perror("open error");
, W% `7 N0 M' }7 F1 w4 ]                return -1;
7 U$ S1 R0 `4 M: n+ Y8 Y        }
- p3 [7 B- E/ E        
# p7 U5 a8 l$ D% }$ O, B% E6 ~        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' G. q% p4 _2 a- @" d' v' k# r7 ?5 V4 k6 b, p% G3 l8 @1 Y: ?  @
        while(1)8 B5 y- H0 l. Y" C7 e5 N7 F* H3 y
        {
1 U! A+ r0 U7 W+ n1 W7 U6 z& G                read_MSG_buffer(mem);
$ e! p) A! H6 D2 m: \$ x        }                / U8 z0 d* G5 I8 Q  ^# \
}$ F' i( p- l& A. v

8 v( f+ s" v. ~. Z) t. svoid read_MSG_buffer(int *baseaddr)& o7 E2 e; q/ ^' }
{
) m) g# C, I9 Z        pRX_MSG_PROTOCOL pshreRAM = NULL;
. v' h1 \* a7 o0 y  e( {8 {2 z5 m) }% T% q/ O  s5 }. b( u
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ m* [+ G: l  S+ C% |1 n4 @/ R5 j0 l- I) z1 b
        if(pshreRAM->packet_cout != count_copy)1 y- c% u( }8 z6 T/ ], d
        {4 I1 w, ~+ \! e5 ~9 X5 K" S
                printf("a is %d\n", pshreRAM->a);
. i, C9 w! I; z9 c7 ]                printf("b is %d\n", pshreRAM->b);% @6 B7 k8 o  H. a
                printf("count is %d\n", pshreRAM->packet_cout);6 m/ m5 S+ ^, `- L
                count_copy = pshreRAM->packet_cout;( }- C, ]6 F& }' f( [2 y
        }
! P, G8 [, @) l$ m        else2 W# S# j+ p5 Y5 Y6 K5 p
        {0 x; D7 w& k. g( A
                printf("No effective message!\n");
6 J. Q+ d  W4 b# H3 o: y7 ~        }" H0 Q( j. y6 j& x/ r" x- f
}
, E1 r9 y# y0 ]  l/ x+ a9 x( P, \$ g8 @* k
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 k% S6 @# {. t1 }, }8 H0 I
2 G  a* |! i" i9 O5 U: k* `. U: l* Z
; y6 N; L4 W: P! r+ i# v# ]

: |" u5 b# T$ W; v( G% |% j, F# K/ `& N' ]$ F





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