嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + v( L& |' W7 n3 `9 P% H( Y, J/ a
7 m( N/ G2 r! j4 U
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; g0 W5 H. C; G% x. u
#include <unistd.h>) n, ]/ s8 `9 k1 c0 N
#include <sys/mman.h>/ A9 R# g* H* [2 e  i
#include <sys/types.h>
' ?8 C3 n2 H" R* i2 Z$ H+ U#include <fcntl.h>
0 k  z7 P% w: l6 }) @
: ^( R8 h1 O/ F2 [  D#define SHAER_RAM_BASE_ADDR    (0x80000000)   
4 w2 M5 @5 e. P
0 r/ X+ n$ |  c7 Q+ Ctypedef struct. n6 x! m! b+ y# X/ o, B' h% ~
{! ]0 o3 {& _2 L1 F
        unsigned int a;
3 }) E; b, D4 k* M        unsigned int b;; ^' e4 y3 W% S( @5 v( q# L
        unsigned int packet_cout;
8 T3 f8 J1 h* F1 {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ i2 L1 s8 H' E- H: O% J6 M" v" I7 R0 d# k" S8 Y4 b; v6 C% f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( B$ d0 O( N% `
unsigned int count_copy = 0;% q: h1 x8 {8 O: s
" o( P6 M6 \  D1 e% t4 @& M

& G# S# ]+ q* p/ N3 Fint main()3 F8 s' s, X+ P+ \( d) O
{
) I' |% N& L# M3 q        pRX_MSG_PROTOCOL pshreRAM = NULL;1 a9 N2 d( U. P2 k
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. I+ @+ L3 s6 P8 ]3 U9 e4 i, u6 N6 Y- u4 W8 r( n
        while(1)8 t8 r( a2 O: M5 Z
        {" {7 t% m8 T( f& E
                read_MSG_buffer(pshreRAM);
- x# y, ]: b- v        }                5 }4 G- I0 t) _( q' K7 T! x- m
}6 B9 S6 v, g5 z, C
  Z) D  I( c9 e. {5 t. w( `9 K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# H# V  L5 G# ?5 V
{
( l7 q' P2 y! g. d- @        RX_MSG_PROTOCOL buf;
3 V9 R" a) x! y* E) z        
! q( G7 j1 e8 q; L! o1 q* c$ S4 O        buf.a = pshreRAM->a;! ]: e% w; R; r3 G
        buf.b = pshreRAM->b;4 W9 i) t7 r) Q6 K
        buf.packet_cout = pshreRAM->packet_cout;9 G9 W- ~% h& t$ h( n) c1 w5 a
        7 h0 v$ E5 X5 \; l! W. I: Y
        if(buf.packet_cout != count_copy)0 Y( J  H# K4 ]
        {
" W5 q: u+ p6 F: G/ ~                printf("a is %d\n", buf.a);, H$ S1 j% m, i- F" g
                printf("b is %d\n", buf.b);
$ L" w- d* r) @  L/ o                printf("count is %d\n", buf.packet_cout);( M. G+ f  x% C0 J. S
                count_copy = buf.packet_cout;; u- i! b- T* b2 V- O. D- j
        }) Q; [! Q6 E; Z, D' w) W' H6 J( v
        else
, s4 F' T" N/ ^% c4 b% h- t# x2 L        {" y7 ]+ q; r) {* V) r" A
                printf("No effective message!");
. F' K( D% k7 y# ~( H5 u) A: w: l        }; h& ~5 p# H2 |6 w+ s* r
}2 L7 ], S! a& X' C3 H+ u3 O+ C

; j7 ]9 o: ?3 J% M9 J. G4 U% z7 _3 V6 g9 T) M8 w
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。3 e8 l. |$ \) @" T9 l
使用下面代码,对内存使用了mmap函数后:
6 }0 S5 H3 y, O$ V8 {#include <stdio.h>9 _/ E3 Q# V8 K
#include <unistd.h>* w) W- z$ x& W) _4 z/ j
#include <sys/mman.h>
( \, j, r/ {, G( J5 A#include <sys/types.h>
6 u* N$ e4 e3 _( `- |7 Z' m8 {#include <fcntl.h>; l6 g! u  Q/ c" h2 K: c

! b4 z2 y, ]5 E5 Z, r. u: F5 f#define SHAER_RAM_BASE_ADDR    (0x80000000)  C5 x$ i- ^! L, @5 R/ {' ?
#define SHAER_RAM_SIZE         (0x20000)   
6 ?0 ?: H7 \% `& @+ F! y/ U7 _$ K" q- z: l
typedef struct
2 T4 Y* y. V" _( A2 p" O( B{' }  y, ~5 H" A
        unsigned int a;
! E6 o7 e2 U1 a1 l        unsigned int b;+ g. X2 y$ G* I
        unsigned int packet_cout;" o; T. ~5 U% k0 e4 y& \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 `' P( A2 A; N8 A$ h, O/ a' t. Q7 X7 I5 t  _5 i( w5 M' F6 i
void read_MSG_buffer(int *baseaddr);: C) U! @1 Y3 I9 U0 E
unsigned int count_copy = 0;" |( a! d3 t7 J* e6 _( h7 X
% E. E2 C% I2 O
int main()* O" Q' }& b4 j% `" V
{& Q( I" |* K* Y- ~$ }: o0 Q2 b
        int fd;+ ^- ?2 E( k% U* u% T
        int *mem = NULL;2 W5 M  M" R9 l$ M* J& S
) J: P3 X. x& \8 f
        if((fd = open("/dev/mem", O_RDWR)) <0)
+ `& U: @; N. h; s% ~# G        {
3 G$ _) V+ q7 @5 K                perror("open error");
8 [; o# q$ ^" Z4 n                return -1;
* M, _; u1 C3 P) z/ ?, t  R        }0 e4 F4 p& ]- B  R
        
0 D7 B  `- N, t" m& z# y4 s& Z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ S1 F( R) p1 d- D% ^
7 G* V* K3 F- L# j0 F
        while(1)
2 a* l' ~+ m# B6 \, C- v$ Z5 @        {
; t9 W3 @, ?8 z9 c4 p                read_MSG_buffer(mem);/ J( C! f5 z! w8 i, t) F  E
        }                0 e) [- W# m, X2 y3 L
}4 B. y# T. u& z+ h& S( }

& a9 X* v2 G% dvoid read_MSG_buffer(int *baseaddr)- O" {9 U0 U. H
{, u% U  z8 B1 d" g. y9 A
        pRX_MSG_PROTOCOL pshreRAM = NULL;% o+ U" M) D. }7 f' i2 r. j

( ~: K- _& Q4 R, i$ v' ]3 K" Q5 i        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 D% v( E7 D4 p+ }  A! b
) k1 z) D' J5 X/ d# X$ W        if(pshreRAM->packet_cout != count_copy)
4 n3 s4 M$ x% m        {% A1 y/ B' R- c
                printf("a is %d\n", pshreRAM->a);# G. f5 R3 g+ A3 d2 R4 A# }
                printf("b is %d\n", pshreRAM->b);
3 [9 ~9 a4 V  C6 D                printf("count is %d\n", pshreRAM->packet_cout);1 y7 G5 s! o% T1 s) X2 H: X
                count_copy = pshreRAM->packet_cout;( X8 |$ {( X' A: m
        }6 Q# t. I/ h0 _
        else/ x- U0 l% R0 Z; v' y) U# {
        {  c1 t, }! s3 Y! k2 B
                printf("No effective message!\n");
0 y8 D% Y2 @; I* q  ~6 K        }- j; t6 u: Z, v4 I
}$ c. R' q) n) Q/ @# r8 T2 i) e) f

$ v$ D( H. W' h+ z  n' J% ]. Y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 X2 S% b, d( n% a# A

# g, U# j2 u6 Y( A
1 ^$ |; H5 n0 a6 P
" s; r2 m9 H' S6 I  u: B/ r8 U. X/ g, p1 U+ `( E





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