嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 K- p3 |' M3 v& k0 [- @. l
9 l9 l. d, I2 |OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* r8 t/ |% G5 Z% Z$ S3 b#include <unistd.h># R. t! X% V) }8 r7 I' Q
#include <sys/mman.h>) o; F! L9 x# Q9 A! t
#include <sys/types.h>* f6 E( E+ C" [% ]/ Q
#include <fcntl.h>  o+ \8 J6 w) k9 ^, T" x

) ?! J! t6 a- J# ^2 e% g( S+ D#define SHAER_RAM_BASE_ADDR    (0x80000000)   
2 N) U; d- N6 A6 B/ w
/ M5 X1 M% M6 O. T* O/ E. Qtypedef struct6 S( O! U* J/ O$ K$ f* G
{6 w" f2 C) L6 R7 C+ v) |
        unsigned int a;
; _% v, T5 l0 S        unsigned int b;
) K$ }* c) e; C# N. p( H- _9 B        unsigned int packet_cout;
! l# E  A' l1 f* w$ L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ R2 j& ?$ ^: ]$ {; n
9 Z. K- Y6 h3 [- U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 m' {3 j" s0 N
unsigned int count_copy = 0;- Z0 s( d/ ]( F; s) o7 i

* Q  j  s( ?+ G2 f8 D' \
* R' X  M! c3 O2 |6 n6 bint main()/ Z6 d2 f% w$ }* x' |+ U% `
{
- |. b  Y" m0 b  S9 ^        pRX_MSG_PROTOCOL pshreRAM = NULL;! N% |( `- N, |. b% c
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 n6 ~$ U( }. z! K7 {. b/ N
, \% I# Z7 K- a0 V/ F- l        while(1)
" r: x* @/ S2 W3 \* o% P        {7 D5 P+ b2 I2 ~2 u& f0 u8 o
                read_MSG_buffer(pshreRAM);
# B! Y  m% ?/ J  @( l7 s        }                , C& ]- c$ F7 x
}9 M/ [+ w* t3 E( J$ x: b  M# _' D

: P+ Y1 V+ @$ F% Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( \* `5 e- v+ N{
7 q2 h/ I+ r: ]3 p" x; k        RX_MSG_PROTOCOL buf;
; f% b0 u3 X9 _" d$ V        
$ d; \, h1 b; S; d: W        buf.a = pshreRAM->a;3 C: c& g  W0 z  @$ \% g  y
        buf.b = pshreRAM->b;. ^- V8 w, N6 \# Z
        buf.packet_cout = pshreRAM->packet_cout;
' [  K* f# o% r! f/ B8 [6 L        
4 t6 C' |5 `! U2 P% d3 F! C/ M        if(buf.packet_cout != count_copy)
% ~" f% w% H/ a        {
% v* O4 N/ J! N, J7 P. j( f                printf("a is %d\n", buf.a);/ l1 Z( t7 K/ {: j
                printf("b is %d\n", buf.b);
; v7 ^- ]9 {% h- K; D% F                printf("count is %d\n", buf.packet_cout);0 \. r" I2 g, |5 @+ e& Z- ]
                count_copy = buf.packet_cout;& I( K% F- I4 n  u# `+ r/ q( o& L
        }
! ]! ~# g" D2 i$ p3 m        else5 J6 B/ K( R1 K( l5 e1 V
        {
/ |9 ^7 @( p/ d( Y; G  S/ _5 u                printf("No effective message!");
% w' Z/ s- M9 d( q. U& M        }
/ O0 x8 q/ r: L  w& Y' E. n}
/ Q6 u/ |1 S+ Z  y' T0 L- n$ n; z0 I" U# V
. @' p5 Q' i& d8 U; p, J, d5 \
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 e- B! T( D8 F( z使用下面代码,对内存使用了mmap函数后:
1 j# Q) F3 ^7 P- {9 R#include <stdio.h>
8 O5 J" ]% M/ |4 r# u#include <unistd.h>
4 E) e; e  ]  [+ ~5 n! a#include <sys/mman.h>
$ N+ @! W2 e  K( d  R+ I#include <sys/types.h>
+ e3 @+ P" x2 c#include <fcntl.h>' h0 x6 B6 i* I: B/ E1 h

7 h6 P% a+ l" `7 a#define SHAER_RAM_BASE_ADDR    (0x80000000)4 X5 M0 W/ u" C- ~
#define SHAER_RAM_SIZE         (0x20000)   5 x1 m4 D! C: k& v/ U- |
5 {/ k( v, h& Y* F& \1 O5 n; ^
typedef struct
$ h/ {8 D- N) [& n2 u9 h{' E2 F- M7 c2 _- p+ D/ j
        unsigned int a;
2 o( Q1 D/ g4 i" t1 L; ^        unsigned int b;$ `+ K/ J5 I& _( z0 x- s5 o5 G
        unsigned int packet_cout;8 D' [5 B% E% X3 D! _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 ]) z3 r$ @* j0 s& e, v4 ?8 M. b/ e. T" \$ }: j3 d
void read_MSG_buffer(int *baseaddr);
/ k; z9 p6 V3 W2 Q3 |- ]unsigned int count_copy = 0;# g/ H  X( [$ K! l

1 J1 J% H1 G: _3 c7 T# o6 ?int main()$ ~* l3 f/ m, I, N# t
{' y  z! s+ z( ]" S, |
        int fd;
. B# @5 t+ Z2 A8 g9 d4 U        int *mem = NULL;: A$ L# T7 k. P- T
- j8 W- A& r  K/ G# E5 d
        if((fd = open("/dev/mem", O_RDWR)) <0)1 Y# h" c' Z1 y9 Z
        {
8 u; L: {, O, g9 \1 c4 q6 ?                perror("open error");
& b6 Z- @  a5 J5 \! [                return -1;
( u7 E& a: S) v' ^* _& e        }
( \& y$ ]! g7 c6 E. ~        : B6 X; [8 L. O1 Y* l0 h$ b
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 `. K+ f- F8 W; \9 Z, `% _5 j  d3 {, O+ N7 h: i
        while(1)
3 `7 }' @$ V# O, ]0 Q* P& G1 J1 i: C        {
% A9 s, x  Y: U9 ?( J                read_MSG_buffer(mem);
( |+ {& g0 i7 X* ]; O- ^" O        }                / {8 G% \( g: J! O5 J
}
5 T8 p* A0 @" O( V, `# @- @' F+ {4 t* n: T6 S0 U: \
void read_MSG_buffer(int *baseaddr)! c7 y+ n- f8 t+ ?9 j7 f5 X
{
2 h( r! Q) G* J6 L' Y; |1 S        pRX_MSG_PROTOCOL pshreRAM = NULL;
- u9 [0 k; N! c1 Y1 O# [% l" k& K
& @9 k; R+ o( p1 @        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% h. n1 M: a5 Z
* ]+ z4 b. C  j( p1 ?
        if(pshreRAM->packet_cout != count_copy)
5 G1 S- Y5 P- x        {
- a$ Z. n/ Q' U( K' k                printf("a is %d\n", pshreRAM->a);& |- y$ ^6 \5 B: R: r8 O5 H' w
                printf("b is %d\n", pshreRAM->b);
5 [: c! S( G: f$ U2 A8 ^                printf("count is %d\n", pshreRAM->packet_cout);% ~# g3 c# k5 I6 ^
                count_copy = pshreRAM->packet_cout;3 q, [' z  Z; T
        }
6 F% Q# H: T3 _# ?        else( U& `- C$ X, s  r2 x
        {
4 N5 M( Z) Q4 M5 V/ B                printf("No effective message!\n");
7 \4 r9 _7 O+ }1 }5 r! p        }, W5 b& ]* Y% a
}
7 O! U5 X3 B: T! z0 b
. |9 I6 P4 Y# ^" {, @% `) {- B没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???+ |" R6 |) C! r: a4 x) Y

/ v! @0 q6 {! X, h
# A0 N* q' a4 Q* C/ W" }; ]
$ ?9 i( B  n2 ~' {2 _/ B1 ?& A4 H) Z/ l3 K2 x9 }





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