嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 I/ X' D& H! _. F1 B0 _' c' D# n

8 K0 Z( T6 N/ r* H, K: q* n! POMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; ?6 ?4 N( U) [/ u+ e+ m1 Q
#include <unistd.h>
+ W4 S: }  H) r; w! ]5 s/ z, M7 i#include <sys/mman.h>
; C) x# o( w8 S5 _/ P/ ~#include <sys/types.h>" j& ^! w; P1 F; j; Y% _3 {$ R
#include <fcntl.h>: ?0 u3 c: k% w
/ C9 p+ L" y9 R! J2 v
#define SHAER_RAM_BASE_ADDR    (0x80000000)   % }  C( x% |6 m2 B& R6 V1 n
, V; g8 V: N; v, w3 y
typedef struct5 i& w% t6 M6 A+ a) Z
{
; t& y) I& v6 m2 g6 Q2 \  U        unsigned int a;* }# e9 n; N! e6 Y
        unsigned int b;
- c8 v! W5 ^; D+ ~2 _4 y        unsigned int packet_cout;& H# r; i: |* A0 B$ z1 }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ B, }; S6 y" ^% @2 O
! h& B% K0 q+ \' B4 `: A6 \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 W5 U  v  x% L: ~1 L) M! o
unsigned int count_copy = 0;, s- `9 Y% u2 R* N

! X2 @# z5 t) s9 `$ Q; u* X0 N4 B/ c
int main()4 @3 u8 _* Y9 w$ [2 I
{4 ^/ W7 Y# v% P/ I3 P
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ _( P0 F7 l9 a
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 W4 c7 g0 r3 h3 S4 a1 c
+ ~4 x9 b$ x, Y" z/ Z* V        while(1)
  g7 a, m1 ]8 K5 I: j) i        {1 F$ p( P, J) ?+ M7 j4 u: R
                read_MSG_buffer(pshreRAM);
! J1 I$ g  e0 R3 u" Z        }                7 V. ]" V1 F: H% l2 Q8 H3 Q
}
  h  ?$ G) F, |; d2 N( s; ^- ~) K% ^5 U; m$ D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& }. d; f3 e/ q3 W" O; {( b2 ]{$ m" x/ x+ [6 o! f2 q4 k  y- D
        RX_MSG_PROTOCOL buf;: g8 i# O9 N' ]; i9 c
        
' F2 f! C5 H' E9 ~* o6 o        buf.a = pshreRAM->a;
" R; i" O! t, O& S        buf.b = pshreRAM->b;
$ I3 w/ ^% \+ T3 F9 U; ]) V3 o$ k        buf.packet_cout = pshreRAM->packet_cout;
# m7 h3 e8 L7 S8 x; U* y# |+ Y7 o        
' `  m. o- E+ {. Z. `8 g1 }        if(buf.packet_cout != count_copy)
' `& V5 ?  L. n        {
' S- Y' p0 m. Y% c                printf("a is %d\n", buf.a);! Y( J# p! ^2 ]7 n7 F6 q% l
                printf("b is %d\n", buf.b);! F; p6 g% t) T) p/ T5 s
                printf("count is %d\n", buf.packet_cout);* s9 `' o4 u6 b1 i/ H9 `1 C
                count_copy = buf.packet_cout;+ ?9 J. @1 b/ Y& n0 l
        }
7 p+ V" {: R1 h& G4 Z        else8 A( v4 m9 g, \  O) L9 j2 t  P
        {
% V1 u) b9 }/ z1 U: u: Z                printf("No effective message!");
+ R8 o. m, R% ?/ x) F' }$ t8 P4 M& n  L% Z        }
1 R- w/ G! g' L% N}
' k/ l! |# ^# [) Q- [0 X: L! M7 E# T" {$ Z. [  f4 C2 H8 U% }' {4 g
! i. I# w/ ?: v& Z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ B7 x; `* Q8 \% }; s, d使用下面代码,对内存使用了mmap函数后:! H6 q# b+ D$ h: ^: T: [8 E
#include <stdio.h>! O  D9 f+ t" r- y+ M
#include <unistd.h>
7 z! y! m; B2 g* q  O! a  X#include <sys/mman.h>1 S- A+ t& P4 a; D7 x
#include <sys/types.h>  c& @4 Q6 F: d/ {5 Y8 X
#include <fcntl.h>" A' p$ w* T" x9 O9 S2 {

0 f9 g7 i* g# k#define SHAER_RAM_BASE_ADDR    (0x80000000)! e- Q- o. y0 ]$ d* i4 @
#define SHAER_RAM_SIZE         (0x20000)   1 x1 W8 @+ M# t( a# g5 k. e

7 u6 D! M( S) E" Itypedef struct& Q9 e$ I! |! F; v
{6 O# X( k# z& U5 i( F( r
        unsigned int a;! k6 l; q4 `. G! [" T
        unsigned int b;
  b, I" ~$ t9 m3 v- o6 M8 H- O        unsigned int packet_cout;2 M" b* _* Y3 h- x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 Y' G% n! m. ?- S9 h  u: ]$ O
4 g0 f* P7 ]( N! wvoid read_MSG_buffer(int *baseaddr);4 \) ?2 V2 b: [9 A; w
unsigned int count_copy = 0;
9 H: L* f( a6 {8 H$ U
- L! C5 Z/ L; G7 x& g- tint main()& @' c# e" `& q& M/ [1 N5 _) A
{" Q9 _4 `. b6 j; w+ k9 ^# n; b* i
        int fd;, Y. p* m3 i3 a0 N$ {) h
        int *mem = NULL;
5 {" {9 x% W" ]# k5 {9 ?; {! M$ y. Z- I5 ?) H
        if((fd = open("/dev/mem", O_RDWR)) <0)& _6 _& M4 ^8 V  T5 U$ O# V% B" h4 P5 m
        {
6 a' ]: o7 y( n% e  }, ]                perror("open error");
, I. N( }3 P/ k1 N8 ~# h+ t; ]                return -1;
; `7 f6 C  f" {! L7 v7 e! j+ z8 X( ~        }
- x. C! W& X( }8 s        8 m% |% ^& x& d6 B9 L! F* {& q
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- P5 |+ i; X- U- P
, O; z, ]5 f: X) ~, f( O
        while(1): g' L2 X: H3 f; {& @
        {+ l9 {9 r1 t; X5 @9 t" n
                read_MSG_buffer(mem);
3 l5 l$ M- p/ H5 v3 C4 n        }               
+ g& H, b; _0 N6 W" A0 E}- I8 ?0 N  r4 G1 {! N5 N

$ n( l9 C2 F. s$ [3 o2 zvoid read_MSG_buffer(int *baseaddr)  z0 R" l. c% H: Z) p8 X4 f5 O: B6 v4 R
{& t3 F# c2 c2 v4 N, ?5 Z, J
        pRX_MSG_PROTOCOL pshreRAM = NULL;2 h7 [9 V! i9 O( @3 {* e. f' B
. [' l' C# z) v7 z
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 l: }: R# r. F' u5 v6 [. e
+ y4 B9 D4 g5 B& u& B/ ^        if(pshreRAM->packet_cout != count_copy)
; r4 g/ a. _2 k3 B        {' ~0 d+ ~0 y" d1 \1 C7 Q
                printf("a is %d\n", pshreRAM->a);7 g; Q$ D$ U  o, v' }: W0 y4 t
                printf("b is %d\n", pshreRAM->b);* i& L, p/ x; {; a6 A) }  h' {# M
                printf("count is %d\n", pshreRAM->packet_cout);
& l+ Y$ Z/ G' {9 N& X. j                count_copy = pshreRAM->packet_cout;
7 L& i: P% |) F; m        }
' U/ Q' U' _8 ^5 ]5 q" X        else
. {+ K; A% ?) I        {
% l" @! F/ a: T5 M: Y% D* Z                printf("No effective message!\n");
3 W- R0 }  a7 a  p) V- k- M1 b. R7 i        }
; Q4 A! P$ `2 V0 w3 S/ B}
& T' M; }- Z& A) E9 p# N; Z' b! Z+ p8 i( c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- f6 h& i: |2 s$ n' H7 w
. H5 b$ L: R' o" J" Z

" Z9 I9 O, n. a& i' b8 W' h8 [) k, M( p! W6 `# z" J

+ l5 V* C. O* ]/ [! N( _% A7 {




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