嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 R5 d/ k$ C+ Z. t" \( f
% J. z3 `  c/ o* Z" O5 V
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. B" j) m- G) N! x9 F3 C9 Q
#include <unistd.h>% o$ ~0 H1 o: z5 S0 I' p: H
#include <sys/mman.h>
8 g, v1 l* I1 g) T+ @#include <sys/types.h>, O5 N  A0 U* E% f! A2 q: ]
#include <fcntl.h>, \3 H! V! w5 G" c

. l8 R( j) J) H7 N* C- |: ~#define SHAER_RAM_BASE_ADDR    (0x80000000)   ; a! o$ i8 H: A

' u6 j! x! H- f8 Q. gtypedef struct/ u7 _4 T5 P9 f/ v& p6 w* m) I4 F
{5 p2 q+ m% }% O' E. b: J
        unsigned int a;
- }! k' K+ w6 \9 a, a* Q' l, E        unsigned int b;; X3 e3 ?3 `0 S) t
        unsigned int packet_cout;  D: M! o7 h- o- b! [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 P2 V. f6 s7 C& K9 \0 D3 [1 U& Q* r  O; I! M6 a4 y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* ^6 H4 C* t( d0 P/ I8 Kunsigned int count_copy = 0;2 B! P$ p' a. U. I+ z  l: Z
3 x0 e1 Q" K  W2 E. L: M
5 W2 v% o9 w1 w% {- h9 X* E# V
int main()1 ^1 k' B% }( i. V. _6 X
{
  h/ i# d7 d2 A        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 A* \: B& @8 Y( y: b1 t        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! x$ P9 y" M1 h, k7 [9 D7 }" i5 C, @

  N. m- J9 C' f; B        while(1)# V: y# |" J: i* g$ o3 o1 ^: z
        {3 u! \5 |' f6 H- h/ O$ d
                read_MSG_buffer(pshreRAM);$ a3 y/ T" S% y3 |0 h% H" a
        }               
/ a( Y8 H: N- _. n& S5 Y}
! G% S4 X( C2 ]9 K# P6 x% W  `* s
: j5 \9 U; N& Yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# ]! s' A2 M' y: J# @6 m{
% Y/ p7 G' S( n" K, {& C! ~0 s& Z- c        RX_MSG_PROTOCOL buf;
. l3 W5 G5 V2 @9 X9 `1 w- b/ c        0 j. o9 l5 N. C/ m- r
        buf.a = pshreRAM->a;% B3 j1 R6 y8 R1 X
        buf.b = pshreRAM->b;
. o9 u) k( n  r9 P/ W        buf.packet_cout = pshreRAM->packet_cout;- I* y3 D/ r2 ~) _
        
1 i9 K+ w- x! ?, w5 H. G+ S: F        if(buf.packet_cout != count_copy)1 ~5 A. k! {( ]$ D( P" Q8 c! ^
        {
4 B5 Y0 r: F( l0 k, E  s                printf("a is %d\n", buf.a);2 t& j3 g9 {6 o" L' q+ M8 a
                printf("b is %d\n", buf.b);. _' W/ ~: N8 L0 O& p- L! A
                printf("count is %d\n", buf.packet_cout);/ T5 I. e& M; f8 K: ^* v. S4 ^" U: x
                count_copy = buf.packet_cout;$ G  n; R& D, l( A. h
        }
1 o3 X0 i0 \; z5 Q2 y: S5 B1 v        else# X$ x6 l) Q0 ^
        {* |2 @- c. J  ?3 G
                printf("No effective message!");5 i6 Q4 w2 R# n6 Q* f* b9 ]9 j* ^; v
        }
6 B( r3 n" e4 ^) V: F, D8 w}
* d& _2 O9 f( _( d, b0 K( b% c
# @* Y. X1 w# P* I0 n2 s, ~
/ l9 Y, H) I/ P4 u1 r但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* j- [3 a7 b  s8 K: C使用下面代码,对内存使用了mmap函数后:6 ?9 V; _8 P3 O9 a; V0 M/ l
#include <stdio.h>" l3 |5 V) ?" j8 U& B' l7 n
#include <unistd.h>
0 I6 X2 D) R2 ]2 G0 q; A$ J9 O, q( k#include <sys/mman.h>
4 a. P5 U4 ]( m* ?( d#include <sys/types.h>
4 B$ h2 }) [# J9 O#include <fcntl.h>. ?; g+ j0 ^9 Y7 L# l5 _

8 g/ t7 B6 R' p* J#define SHAER_RAM_BASE_ADDR    (0x80000000)
  K+ N- p7 c: M" C$ P#define SHAER_RAM_SIZE         (0x20000)   
) f& P5 y7 j7 b! U5 u. G
/ q( J" h) v* ]# M! R' l4 gtypedef struct
+ Q) y0 W9 B" ]# i0 X/ a: d{
/ _2 y! ^2 O; X1 V1 p        unsigned int a;& [0 c# K+ ?- A+ q5 A" x0 Y3 ?
        unsigned int b;
; q0 L; L( Z1 p. [        unsigned int packet_cout;4 o: h3 y) ~/ v! b8 [: T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 |) A6 x1 x" r7 m' K7 B. f5 j

& d/ y3 i+ c, a/ q9 i; ]9 cvoid read_MSG_buffer(int *baseaddr);0 l& t4 L, s$ z: |( u, o
unsigned int count_copy = 0;, @/ z; m8 n4 H! i; E. k  S- a# E. d

' _9 n7 Q4 x6 ~+ Pint main()* d/ ~" ~; r$ D! g
{
4 Y! ^9 z+ z% P* q) i4 g8 o2 U        int fd;1 N6 e- }/ _7 K- Q2 K1 @
        int *mem = NULL;
+ ?( \' S) Z1 l/ i. c% I0 r7 U7 i. Z/ A( }, s: w9 s
        if((fd = open("/dev/mem", O_RDWR)) <0)2 I7 E2 s+ Q; T. K6 f( _2 e
        {
6 C  S: t; _' n$ G+ z                perror("open error");
: ^8 ^  c; p1 H- _/ \" i# b                return -1;
* I/ W/ L; t7 o+ f. b        }
+ [* ?( X) N( P9 Q7 Q& h        ' c7 t' `' }% q! R8 Q- Y
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( P8 A2 }, _# d- [* _2 w

( f; f# q3 [- T2 R9 K! {( c4 J4 _        while(1)
8 Y7 r: D9 N5 X" G5 a, V- T5 T        {9 a* `$ A* ~0 z1 }
                read_MSG_buffer(mem);: U! J* ^* g- ~5 b1 A
        }                ' O' k( t$ ?" w' L7 ~* ?
}  ?2 S+ `8 Y6 C) q0 Z( y7 `4 ?. E
$ f# |8 b7 m* }/ Y; q
void read_MSG_buffer(int *baseaddr)
! _5 v! n1 G+ k" y1 G9 U9 s{5 e( o$ t) {1 }' D  R; O. P* L: C
        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 d/ R' j9 J3 h/ [5 l
/ z; B; p/ }' i4 x/ _- E2 ?% J: b        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 h0 r# ^! U6 s8 v: w% u, w: r. r4 ~6 H) T9 X1 C* q2 ]
        if(pshreRAM->packet_cout != count_copy)! B8 U9 z3 E  H5 D
        {+ H  h" \  j! _4 r  D
                printf("a is %d\n", pshreRAM->a);
0 b: `- x) K* S) x' w                printf("b is %d\n", pshreRAM->b);
( e: U. o- I7 N: p1 n5 B. Y) H                printf("count is %d\n", pshreRAM->packet_cout);/ f; L! o1 ]* Y* \- X$ e0 J0 t0 x5 Y
                count_copy = pshreRAM->packet_cout;  }0 K% i& K2 @
        }* J) K4 Y/ ^( a/ b
        else/ g2 j3 c* f0 A' D; E, v9 F6 L
        {
0 k* e# ^% O) D4 W$ e- H: ]                printf("No effective message!\n");8 y: z8 O# n( z, l
        }  u) \0 L! y7 g: _2 ~  M; [6 M- l" P
}
' \+ P- K/ K- I" @/ o  @, N3 V
6 |  V1 w. F- T4 ?$ Q# t, a3 L没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! C! f# {6 y/ T' X# b" C

7 l7 P) o, Z- V
5 x) k$ q# Y, ~1 R# h0 @; |# ~6 _0 v7 {

0 ]9 q: |. B4 A% n  c7 \




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