嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  P5 |, r* w; ?( _+ S! H
' h8 r! h/ x( i. M( M& ?OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! K- i6 X9 e& N+ i* h
#include <unistd.h>
6 t7 [% e2 r2 v#include <sys/mman.h>
: e! k; g* Y5 a/ _+ Y! p5 C#include <sys/types.h>
7 h0 h6 z- Y0 h#include <fcntl.h>9 W3 x" V  `$ B) q

+ E" `- E3 a! b  g#define SHAER_RAM_BASE_ADDR    (0x80000000)   
; S8 }8 `3 a& w% H
  m$ s( X3 X- E/ G4 Y5 p  }! l  {typedef struct9 e! N4 f# {4 R- K. H
{
% m, f$ a" N" H4 t7 p! _        unsigned int a;& W/ {" [4 v, D+ E  T3 d
        unsigned int b;
* s# }) y3 _6 N1 Y2 b6 k, t% V        unsigned int packet_cout;
$ T2 S0 p' {' |' |}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( t8 N3 \7 w1 k+ A7 X3 O2 A# _. H7 L
( Y2 b9 k9 q+ i/ T& l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);0 j9 C+ r7 n$ B5 w  F4 G4 L6 G
unsigned int count_copy = 0;9 }3 M7 I/ {  l" Q( j! u
3 A, |- V3 }" U/ x- B" e
1 n, o- T% g' q; m5 L
int main()" O; X: z- a- f! x; H1 h* B% J
{
- g2 _1 K1 d- U3 B        pRX_MSG_PROTOCOL pshreRAM = NULL;) T. l6 x! ~5 D7 H+ C! P6 l
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% J3 u  U" H7 L1 N' G4 k' T
0 s' A; u. B6 [' _0 g- T3 w' N% `        while(1)
* @; [; z/ F4 c7 F+ @3 u        {; @( }2 N3 {  P% h
                read_MSG_buffer(pshreRAM);
; T3 T0 D# |9 Y        }               
& e; Q. P  n9 p0 m* r* {) P: T}8 M$ s4 J5 c/ W( o
$ b6 b& A  Z9 u1 C6 i3 z& x/ ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- \0 V  b" V: k. L2 T{
6 R# |; C4 z" r& x+ Q- c9 ~7 Z        RX_MSG_PROTOCOL buf;2 t# r& y* n" W  d- o# r
        0 Z( X8 W1 e' Y- C. }
        buf.a = pshreRAM->a;
! S& \6 m+ T' y4 {        buf.b = pshreRAM->b;, H9 q$ }& E5 L2 {9 S* s9 R! c
        buf.packet_cout = pshreRAM->packet_cout;5 n' y; H  p5 ?$ N, ?1 ?6 G- I$ H4 t
        / L/ O" S" w' U+ b: k
        if(buf.packet_cout != count_copy)) S' p6 `& \: {( |! P
        {; Z$ R- W2 n8 u$ M% O
                printf("a is %d\n", buf.a);
% X" I, v; ]( J8 C/ B# K" W( ?' U                printf("b is %d\n", buf.b);
6 g$ i" t  x3 K' C6 O- K                printf("count is %d\n", buf.packet_cout);
( }* a7 _$ v( f( Q- M+ `                count_copy = buf.packet_cout;
- l* c1 D1 Y: g- J4 M7 b% Y        }
8 i* s* G  t1 m        else
( M- l, ?: v/ Q9 l; n5 p        {" P$ k9 x/ R( j) B
                printf("No effective message!");& a2 |4 L! O. S) r$ g$ K* b
        }
( b( f6 h5 i( m% l8 `% \' ^}6 K3 M, X8 Z: b' Y; Z
, v% t/ N; s" S8 F

$ E' N( Y; q+ Y$ i4 a# K但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: K; A/ |! n" i6 h# N& C使用下面代码,对内存使用了mmap函数后:
% O6 x0 ?1 X- W# [4 E#include <stdio.h>
) r, [0 X9 U3 t% |#include <unistd.h>
" P7 V4 Z* X8 ~7 h! ~8 ~" p# Y& ~#include <sys/mman.h>4 A4 U) H7 r6 T9 Y. ?" C" j0 s
#include <sys/types.h>" J8 L' v7 g$ @
#include <fcntl.h>
% U) C1 N3 V- r6 R* e7 z! d, m5 [
" v) [1 [3 [% G/ D7 E) s7 N  R  @#define SHAER_RAM_BASE_ADDR    (0x80000000)
1 t3 E# l2 q6 G9 s$ l#define SHAER_RAM_SIZE         (0x20000)   $ ~% z2 `  y+ A) v( I" ]
' A; l7 {, C; R# N( i+ L! c2 I
typedef struct" u+ m5 P8 f# l6 A1 P( }% W
{( B" V* g0 E% z: F7 v7 M' i
        unsigned int a;
8 W1 l1 n3 ^) \; d9 U3 |$ F5 t        unsigned int b;
: L' O+ }. z# j5 F0 Y4 M1 \1 l        unsigned int packet_cout;
4 k8 N% t/ l0 Z9 z4 ~$ N}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 n! E% o4 y7 a) [, b' ^
0 s7 P; P' Z& o9 t$ J
void read_MSG_buffer(int *baseaddr);
9 J5 E8 V0 J0 lunsigned int count_copy = 0;
: ]" v8 ~$ c7 m% M/ J: O! q# Z* i9 H' O; G' z+ y3 ^5 G
int main()5 `8 _5 C9 q* e- S
{
3 D* T, G0 W% Y3 Q        int fd;2 \& k" I+ F9 u3 B% [1 P- F# n
        int *mem = NULL;7 K/ z9 j- g# h& }3 U! D
7 M9 x+ [; k- O/ P2 d+ p( ^) v
        if((fd = open("/dev/mem", O_RDWR)) <0)6 D" X) U  y* S6 }) g1 p% _
        {3 |' h( x7 }. p) m! s) K: ?
                perror("open error");1 Q7 d/ @3 b) L( I- |6 p* `* C/ _
                return -1;
7 N# j% W( X2 l. M5 s0 ~        }2 A; m2 ~+ P) A/ s' N- j7 n
        
9 o' E5 v- n  r8 y/ \        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 I. o4 g2 k! {$ N
- J+ z" _  s5 @- I2 Y        while(1)
% B" T$ L( ?$ L: ]        {
. g/ U! x% X  w5 ]* R: r6 P                read_MSG_buffer(mem);
1 G# P3 K- h3 R  Q: f        }               
) i: P; ~- G) C) y. K, U}
: y8 d8 l* `$ h& B1 o; j/ v& n2 W5 y4 J! m7 @' Z- @: R* l2 R7 G
void read_MSG_buffer(int *baseaddr)
" x: B% h& e; y" C: z5 T  @{4 e/ z, h9 D: P4 P7 A, e
        pRX_MSG_PROTOCOL pshreRAM = NULL;
) T2 v  M( S- N6 s) g6 I
; }: U* u. a2 w        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, K( {& X3 k; b7 F' Z3 z* |

, R9 }% M8 L# l8 S        if(pshreRAM->packet_cout != count_copy)4 c2 r% D6 a$ @) V5 h% f7 a
        {
" m$ B# e; Y) \' V! l: M5 ~9 R                printf("a is %d\n", pshreRAM->a);
, G! L. X" `' d. ?                printf("b is %d\n", pshreRAM->b);9 q( {+ Q% m# p% f9 I5 L0 K3 h& v
                printf("count is %d\n", pshreRAM->packet_cout);3 z! D% Q/ y1 ^' y# T
                count_copy = pshreRAM->packet_cout;; B2 d" E& g/ h" Z% B' l! Y
        }
$ w6 [* }, }0 S$ q        else0 {; c# s  S: }5 @: x% P7 f3 H
        {( B- w( t6 Y* g
                printf("No effective message!\n");9 r! e) y1 g4 s# J- C+ H0 x
        }
( @# S! F: ?& q* T- l- Z7 U}% R  v' ], w2 r% n; G

* K- f. A  f# X( @7 B/ O1 P' V没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 T# L4 c& x. [  N& b! U% F. F
$ p1 n# d) C# C: X* b# w
- q% D% g+ C2 r2 m5 `! i. k
. z5 A- _. V& `& H1 @3 W# I
. h7 w" Z* t' M* u: C7 I8 U+ t




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