嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! q/ _1 N; }, G6 U% X; `& z5 h" G- c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, o3 }) [2 l+ x- ?; G0 u
#include <unistd.h>' n' `$ _! t( |7 a# @; f
#include <sys/mman.h>5 e8 ]' V6 S$ d* N9 B7 S
#include <sys/types.h>  i' H( [! }9 d: D$ L
#include <fcntl.h>3 v2 }4 k  M% M! \! [$ w
6 A% c2 g& G0 S1 [5 A
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
- l. F% a+ j; o
5 ]6 R1 }" Z% o# [: m2 ztypedef struct
2 n% g/ k+ A9 `$ G5 s8 i& q: S{
+ D1 {! I2 z# i! Q9 Q" n        unsigned int a;+ M- y/ A" J/ K7 N
        unsigned int b;8 |- M- c9 y. H  D8 J
        unsigned int packet_cout;2 O/ e* }( z& E9 o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" V1 c% K5 \! G) J; [* M$ V
! i) e1 ]* U6 Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. X9 c2 M$ Y2 z: u
unsigned int count_copy = 0;
7 J4 E0 }; [) f3 O/ ]7 }4 ?" e  X& w& b! A" m, \

; Q8 E# ?9 s. y- T6 F4 B( Xint main()
. ?& M. X& C: p8 l# S{
: x1 J) @' y/ A, ^) r3 L0 H# g. y* I3 I. T        pRX_MSG_PROTOCOL pshreRAM = NULL;
& T4 W2 V$ C* K3 Z. Z( S        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, B5 G+ x4 m3 v1 K0 M* }8 f

& d( b; T6 O1 Y8 F* K        while(1); q$ I* ^' Y/ T, }' i
        {
& G" d( r- e+ Y' C                read_MSG_buffer(pshreRAM);7 g. t5 b. `( h  K/ o  [9 k8 ]+ a: B
        }               
2 P' ?1 }' U; R6 M) o7 s}
- l! j) R/ L1 U+ D; l+ D* r( b9 P: `' t$ S' f# i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)! z- E5 N9 I# R0 d/ x. D3 j
{
4 v6 O4 v" u% s  K* \        RX_MSG_PROTOCOL buf;
1 m/ s4 R* w& I2 X* `, I6 W2 x) M        
$ J% p! e/ ~1 G$ V* o3 `4 _        buf.a = pshreRAM->a;- _6 s1 G. z2 |' L! r8 v' p
        buf.b = pshreRAM->b;. ]/ d  U0 C# w
        buf.packet_cout = pshreRAM->packet_cout;2 o5 l, v$ K) s. z7 s5 Q! v1 @% {9 Y
        ( o5 X& t- N$ A& i( y, ~. N2 J
        if(buf.packet_cout != count_copy)- l" n! k( q8 j; k- i
        {. W, F% q7 Y" a2 W& D) L1 p* n& w
                printf("a is %d\n", buf.a);
$ p/ b9 ?! B4 L9 i% z. @( N                printf("b is %d\n", buf.b);
- q( T7 b7 u, d" c                printf("count is %d\n", buf.packet_cout);: z% G" d0 [% {/ B' k$ K/ ~% ]
                count_copy = buf.packet_cout;; v: @" B  P  i/ c1 x& p
        }, l: E% ~9 l7 l" w9 ?- c% R0 `2 w
        else! ~6 [/ p+ t  }1 a, ^- G
        {
- T6 D* |5 `5 F( _1 n, y; x) w                printf("No effective message!");: {  V/ A* `: o3 f' x, t
        }  F" N" J/ C* s; N1 ]% X5 o% ~
}) w4 Y" l9 p: b7 f
! Z& F% E3 S, b5 ?  s- ]! ~3 d

( S4 w; m9 L% d' g( j; e! v3 A  p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; _! C7 n* d/ C; [使用下面代码,对内存使用了mmap函数后:
. Z6 {' n" z( T5 o#include <stdio.h>9 M. z4 L9 T; |" A- ~
#include <unistd.h>  h: f  c$ K% i' J7 C9 Q# {
#include <sys/mman.h>8 F/ z* j+ K$ R& V
#include <sys/types.h>' Y" }( Y! l$ x% t+ w. I
#include <fcntl.h>! h. [; e9 c% N; Y

, A" l% e5 |; \, i# o#define SHAER_RAM_BASE_ADDR    (0x80000000)" k4 K3 \$ R# ]$ p* c
#define SHAER_RAM_SIZE         (0x20000)   
5 u1 R* E% v# m
& g+ _# }, J, \9 n# R9 dtypedef struct
: R3 x" C9 i8 P0 f- b{' e' k7 g4 f7 f( M+ l
        unsigned int a;% Z9 i* a" T9 a) _
        unsigned int b;
$ w6 d* r3 w/ Q8 y% w        unsigned int packet_cout;3 s6 M: v# e1 |8 C' Q* P2 L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 G3 V' V) i. I

3 |  t% g0 H3 q! y) ^; O: l( kvoid read_MSG_buffer(int *baseaddr);% s8 i: R- f# [4 W0 [' O
unsigned int count_copy = 0;
, C- `/ l) T7 I8 x) J: N9 J; Y5 U3 ]9 I& s% M; P
int main()
7 V. V8 p6 D: B4 Z: r6 n" m{! x+ [  h7 u4 q# `- x
        int fd;  X: G8 {9 X* [% V0 l
        int *mem = NULL;
8 h4 u! h% e9 y! A* g3 ~5 [
# g) d! ~1 V5 O4 p6 H        if((fd = open("/dev/mem", O_RDWR)) <0)5 {+ O( S3 l$ y% ]
        {
/ v! n2 z/ M5 l9 i- E$ W                perror("open error");
' \- a5 |& ^* R2 ^$ a! {                return -1;
) k+ h/ }0 Z& C( J2 o/ B, N        }3 Q# |) C6 u5 H; Z
        5 F% C) D# q; ?  j
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);4 o+ x1 i+ G3 T3 U  ?

1 e" f7 u  L2 p! W6 W        while(1)
& H9 O1 ~* h; r7 E' ?; h% ~        {
: h0 e0 x! ^" ]/ Y( g0 V                read_MSG_buffer(mem);
3 |6 @( e; i7 L% a        }                2 S" k5 \' \! X" t
}
2 G4 {/ C7 T5 j+ U2 |
. K/ G5 h: p6 c: e2 b! ]' Svoid read_MSG_buffer(int *baseaddr)
1 l4 G; }+ @% S, P{
7 Z+ d/ \% b1 U+ Q5 ^" g% S& a        pRX_MSG_PROTOCOL pshreRAM = NULL;! p" E* Y; b' |

% H) O0 I$ j8 @) |4 s9 [        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
) \+ Y- d* t$ s0 I8 O" o! E
# M9 @0 q5 ^! w( V* j        if(pshreRAM->packet_cout != count_copy)) \: P3 k4 y2 i, o
        {
* }) J$ U9 W( M+ x' ]                printf("a is %d\n", pshreRAM->a);; e' P# X. P4 @; ?3 o- S( U1 [1 I
                printf("b is %d\n", pshreRAM->b);
9 Q2 `/ }  B4 k' E' H# z& b, b/ w                printf("count is %d\n", pshreRAM->packet_cout);
& R, H( u- R/ ]3 Y                count_copy = pshreRAM->packet_cout;
# J, x" ^# O' F( h) V/ Y        }
( @4 J9 q& C4 j9 _; N1 e; [! N" g5 r        else
- u- i: t& T# h$ K& L8 u1 A$ Y; {        {
' `% [- m& a3 l/ K$ p2 {                printf("No effective message!\n");
4 e3 N* q7 }: y2 C        }# i; L! m8 J& N4 o  D0 ^
}7 c' z7 ?# u& q% R; ~
. w* _! S, _( s% X3 F8 ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 ^: m) z5 k, w  x. n

' d. Q$ A7 L7 r  Q. n
3 R# z+ O. b+ a6 [( Y1 T/ \5 @" p
$ b: O" [4 \& l/ l" u
) S* V" d5 E' r* `& G




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