嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) y3 a2 B9 X) B* `2 o9 t# n  D

. z8 L# \* Q1 |. {5 QOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: Z- D) C  _% \9 b  v
#include <unistd.h>
5 m2 e7 s6 L; O7 K9 h+ d8 X" |#include <sys/mman.h>
! h+ T2 U5 A* Q7 e0 s0 Z  {" i) ~#include <sys/types.h>
5 Z& N- Y3 F0 R/ ^% e#include <fcntl.h>1 w) B8 D- W5 |" {, [) X$ p
1 ]9 T9 r! A" o8 z# p
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
4 O. r% Q  L' d% `+ ?% x/ t& e8 y1 J
typedef struct7 z" s; X( @5 c! e! G
{# e/ N  ~6 i: Y1 g9 [8 b% |
        unsigned int a;
: R9 r4 v( Z3 g0 c, D        unsigned int b;
! \1 ^' ]0 H. W. a/ n1 b        unsigned int packet_cout;( Z; ^, Q1 E( b" A: }% {. T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; S2 `& Y4 w, R6 V/ t: ]' @" A3 Z
3 O( z9 M+ o# c  R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ l$ r0 z) m) P) ^
unsigned int count_copy = 0;0 j: w& _8 O5 v

* G7 w6 `) S1 L: C+ }2 M& Z3 I# W; B: E2 j
int main()6 E& K0 e% w/ q; q7 ?% S7 f" A
{, s* \( w, }, C) b2 p( w8 L
        pRX_MSG_PROTOCOL pshreRAM = NULL;
) S! Q) {) d+ F: Y        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  K! R2 g. `" @5 y$ D$ l. L6 m) r9 p# T( N/ Y9 Y+ ]
        while(1)
7 w) k9 j. I6 S" `  ?- U        {$ Z2 T6 h. \5 b7 ~) Q% S
                read_MSG_buffer(pshreRAM);+ J0 b- d- K/ {- `, C
        }                6 ^( p& a! a$ E7 E
}6 N, M8 H/ D# ^9 h& z  R" w

8 U$ o$ u4 F1 y' D$ }) [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" F$ G& M# S$ S- M' R* d, {{' e. e# A5 |' ]  i  y- `
        RX_MSG_PROTOCOL buf;( G! Z; b- F" R. k
        
9 W8 d- a3 N  h$ e4 y        buf.a = pshreRAM->a;
8 x  i/ {, \3 y        buf.b = pshreRAM->b;
2 j5 Y4 H; Q% E        buf.packet_cout = pshreRAM->packet_cout;" w- T& q; ]" Q* u
        
8 S% V- j# M$ `; V. f& l6 ], o. C        if(buf.packet_cout != count_copy)
5 s( g) o& n. A2 s& u        {, j3 W: y( D# I1 ^3 B" C3 i
                printf("a is %d\n", buf.a);4 v  q# u+ P/ P. S
                printf("b is %d\n", buf.b);
: O9 Z. G: `$ F* a, S. [                printf("count is %d\n", buf.packet_cout);3 i3 a7 J) U& D. s7 r, W
                count_copy = buf.packet_cout;
8 v# b+ c, W( d' }2 b+ m9 Y. I' o( H        }
2 s/ v6 A# M6 O7 V; u5 {        else, B' y/ d& V( ~) h! K3 \: m+ \) G
        {
! C" z" B3 y6 F0 o$ U1 B  N                printf("No effective message!");) z7 y5 q9 R4 M( z( n$ `
        }' V; M7 \$ T" }& |
}( J8 `. _+ u0 u

, H) _7 i; L: M- R% u) l5 c/ h) V# g$ z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: W+ t  c% T' b2 q) g
使用下面代码,对内存使用了mmap函数后:! C! r) Q' S3 q7 l8 F1 ]
#include <stdio.h>3 P6 O4 I- G. {6 R4 c5 E. w+ c3 @/ |
#include <unistd.h>* q5 _- W7 }3 a! P: G
#include <sys/mman.h>
# k$ b! D! q2 R9 h$ I3 y' {#include <sys/types.h>
! i$ z) B2 S- R* t9 `, d4 s6 G#include <fcntl.h>) o  u: x' q* e; M) `0 c. L
' R9 D5 j% W, K3 n# ]
#define SHAER_RAM_BASE_ADDR    (0x80000000)) W+ W$ a' ^! o) S2 a- ]0 G
#define SHAER_RAM_SIZE         (0x20000)   0 O4 ]9 Q: h- @! @+ ?

; B/ k. k; ?5 I) Z9 H" M" ]7 N$ J9 utypedef struct
1 l; `; J" I; J% J3 S{2 ^. C" n( K; L& _
        unsigned int a;
; _9 M% R& }2 P        unsigned int b;
! X- I: c% G- s' f2 ~/ U        unsigned int packet_cout;
; d+ E! _% S& o' i; W: x3 p  P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 ?- @8 i/ ~* ^! @0 G, W/ e. {
" W; v2 d9 R: Y9 `* W, _1 C
void read_MSG_buffer(int *baseaddr);; V3 X: j9 b5 o9 q
unsigned int count_copy = 0;) C8 G* n* ^: |; P- v. m( W' l
: P, y% p8 a" F) \- |! L
int main()9 i( Q- g" Y7 i4 B% a; q% @: h: y
{" c0 f. q; {" B: y. W. }
        int fd;
3 g; V! V/ ]+ J& _        int *mem = NULL;
9 B- }6 {: A9 g- @( B) f& A7 S: I; k
        if((fd = open("/dev/mem", O_RDWR)) <0)
7 M8 g+ c& z$ E- u        {$ J* o: ^6 J3 Q- \% Q! E0 Z6 E$ J& n
                perror("open error");
. N+ v5 ^5 |" @2 N                return -1;" ^- ~" D) m) g
        }
8 _# P! z1 e9 s& f# \" \! b        
5 G5 s  @7 w6 m6 e3 j        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# M0 W1 W  j* Q) R2 E) E# ]
( z; W' t/ N( w
        while(1), @* S% a0 x) c" h- _
        {, _; I; y2 l5 V2 b$ m- p
                read_MSG_buffer(mem);
1 @8 }- p7 c. ]5 b( d5 D# }( T$ o, N4 l        }                + p( v, ]) [0 d: ~' F, G
}
1 _: t. E- c; j8 U5 W$ L& f2 F; D1 R* Y5 x/ E5 x# y4 v
void read_MSG_buffer(int *baseaddr)& q1 v3 S8 D, G1 Q
{% N$ Z, f+ ]$ K( \# U- c; l) C& A
        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 W) Y3 u; U0 f7 P+ }* S: Y) ?8 p  L5 M! P: I
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 w+ z& i0 c" L% ?8 M3 O/ q. t

% {# O  Q' }% i- @# a; {        if(pshreRAM->packet_cout != count_copy)
3 B8 t+ f+ n7 G* L" M        {" w) n5 S! S3 S, v- h
                printf("a is %d\n", pshreRAM->a);
- ~" G. L  Y* ~6 i                printf("b is %d\n", pshreRAM->b);
+ y; ?4 ^* [+ r' H                printf("count is %d\n", pshreRAM->packet_cout);& P, R+ C2 H% I. O8 [  e- C
                count_copy = pshreRAM->packet_cout;2 h  y) E( c9 W0 g2 j9 c
        }$ E3 c' y. s: x% Z. n& T& v
        else
2 k. `0 v( A) P( t        {$ r" S6 ^0 U- R" j+ F3 G
                printf("No effective message!\n");; u4 d! x# i$ @8 j( }' n+ d
        }  ]+ C) M* q* j; z' g1 z
}
# ?. A6 p' J) P) a1 X/ l) P+ {: Y# W$ F3 P5 y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; z/ v1 \8 |; \+ I; I. l) \) A
1 @2 w# N: F2 U: b+ Z; u0 q/ s1 S  S; b/ o. X

0 L" m: C" R- y3 c1 m( A- c# J' H. t. `8 O8 I% X





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