嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( j& r: t% Y0 z* b0 r0 o: x9 t9 ^6 {4 y% y1 P( ?; p4 @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& ~' o! l) R/ z2 ?
#include <unistd.h>
$ h7 z2 S& X1 R  E#include <sys/mman.h>
7 O1 ~, k( z, X) }/ x9 a#include <sys/types.h>, Q1 D3 Z% R' a% q% ~3 Z
#include <fcntl.h>
" m- a( [% N! D% ], O: y+ J3 G* U% K- {
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
/ ]0 R% x; s8 K# Y" X  o
, E7 s% P9 F+ D7 Etypedef struct4 m' w$ U: Y: k
{
# u- P% W/ J' c* S, \        unsigned int a;1 [1 T' g0 m+ U
        unsigned int b;
7 |$ k5 B# I: v  A: Q6 u; k        unsigned int packet_cout;
3 R" G6 X+ ~2 e$ W* H. s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 }, x2 R% a4 l; i( {
% {9 b' Z; g+ U, ~& s+ ~$ I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, O, \: X  g0 ~0 k5 b0 L, W  I- N' Nunsigned int count_copy = 0;9 K0 N$ |0 x. W3 r$ V
  H! o( K; t- y' B6 |) s" o/ s
- e# D% x) j! r/ v3 ]* w
int main()9 d; D; N+ N( K. n: t7 x& T
{
: f* u7 k" {; u6 D+ R* c0 T$ J& d        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 n- U& G# }4 R0 c3 k% D! f9 x        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. [/ R) ^. N9 i
/ d5 b( W7 {. \: r8 e; {        while(1)2 }5 C9 y( N* m& A$ ]5 H
        {
% E4 M3 F7 P* E5 _( m& f                read_MSG_buffer(pshreRAM);
$ |1 B1 @3 l+ U( r- U3 T2 I" N        }                . x8 Z$ B8 g7 w  W' `- j% x9 v) C
}
  L# d. V: _* a9 T- C9 D& l' G( f4 ]# U
9 O% k6 Z" K% H, Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 ~" ?0 a( `# O5 Q{; Z, |/ g" |: F- i5 L
        RX_MSG_PROTOCOL buf;/ w4 q3 o* `7 _4 a/ y
        " U. B& c' C. |$ c$ _$ A0 p! K
        buf.a = pshreRAM->a;/ e" G7 v# O% _$ J
        buf.b = pshreRAM->b;* o, Z, I' ~% {3 F' ~( E8 |
        buf.packet_cout = pshreRAM->packet_cout;6 G# ~+ P# J3 J- B4 \& A5 v
        * x9 c8 b# r, \
        if(buf.packet_cout != count_copy)" t4 r' ]- Y( u  X
        {2 D; A  F2 T# k; R/ b2 O5 e; Y8 f0 E
                printf("a is %d\n", buf.a);
; S2 k4 Q4 z0 q7 H! ?                printf("b is %d\n", buf.b);
' o: t' f9 b2 r( E( @! F                printf("count is %d\n", buf.packet_cout);) Z& r3 p9 i, o8 c  ~; [
                count_copy = buf.packet_cout;
/ D  z, S; T. l8 v# l& C  R* T! t        }  L- S/ M- [; {# Z
        else
" W) d' I- t" E' s9 h% T/ k        {
5 @9 G/ ^, U$ ?7 l                printf("No effective message!");
0 v9 K& W) S! X* M  h* t        }
" v* ^& v2 ?# k}7 E: S3 Z* Z6 B) z
7 _  y- b% H4 ~
+ ?/ {* i! r$ A" o
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ S3 D5 D4 b; x; l
使用下面代码,对内存使用了mmap函数后:$ Q- g6 F: E* @* \6 R
#include <stdio.h>& A& F8 v6 z! C; V5 \5 K4 M3 H
#include <unistd.h>
, I3 s/ j6 l; L/ w, h7 y5 W#include <sys/mman.h>
, y9 @5 @$ y; ^9 Y& x! z* D% _: [#include <sys/types.h>! @3 X" G) n+ U9 j! Y* \1 ^, y
#include <fcntl.h>
. B0 `: ^  ^% ^+ W# u3 J$ \
8 H0 w( n, P5 [4 D- o8 U#define SHAER_RAM_BASE_ADDR    (0x80000000)
. D( R  n, D& V0 ?- l) \#define SHAER_RAM_SIZE         (0x20000)   
. {& T9 Z+ P5 a, q3 Q; G2 x; X, P* W! y
typedef struct
! e- z, }" t" D- T( ?5 k! [" u+ t{
* x  v- ?; c; V: ]        unsigned int a;% r3 {( y0 x# _( v- ~; ]: d3 C$ U. v
        unsigned int b;
, S1 p1 O5 n: \" k4 A  b        unsigned int packet_cout;( K  G* C) j8 M& a( V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 R1 ^2 d* r  H2 g  y$ r* \- B! f

: k4 G) H# }, Q; B# V6 Pvoid read_MSG_buffer(int *baseaddr);
" z0 J, t6 m; C' l, ?& ~6 xunsigned int count_copy = 0;
9 {8 i; r! J$ n2 @" ~7 d% M  `
) y; X' h1 V5 J8 f6 Cint main()+ V3 C  w5 k  m8 _& ]: k
{
# g, @; l$ ?, g" N/ @( Q1 S: m/ l        int fd;% y+ K( F" }% X% X' Q: c# I
        int *mem = NULL;) _! O2 y9 A6 L; L

  ^4 R/ Q4 H7 \2 R        if((fd = open("/dev/mem", O_RDWR)) <0): [7 N; N4 F. B& W2 ~+ _
        {' L  X6 x2 d5 Q, \4 j
                perror("open error");; {! R0 m' R/ Y
                return -1;5 W. ^# u  j9 M1 |8 Q, f# d
        }, Q, w: f3 G, U
        
) x' p7 {* c" G( c        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ Z& P" Y3 P2 @/ I  Q
' A3 n; b( d- r$ E        while(1)2 Q5 k/ ~2 H& b" s4 n! n8 [+ f+ q
        {; h9 g) Y; J3 j& H
                read_MSG_buffer(mem);' f4 I, o) w6 [; N/ R
        }               
; J# R9 f4 z- V" R}
+ u- U- @  Z2 s3 l  e5 V* Q. E6 T# L3 c* Y9 c  q8 b8 y( K
void read_MSG_buffer(int *baseaddr)
: I$ H8 O$ V* X; a{
1 z$ j: v! m  B- G2 U5 @7 |- @9 e        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 |7 _& w0 O" ?( B/ ?9 n1 G+ `0 D( @2 s2 ]" `7 Y0 g
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* y, B' w. M. f2 t4 D5 ~* z

( F- o$ M7 A  h* D        if(pshreRAM->packet_cout != count_copy)" D+ ^. p2 z/ [: @3 E' z% F
        {
  n! K' F7 c$ ~                printf("a is %d\n", pshreRAM->a);( O5 ~4 T4 M( p# }' x& M! ~- p# j
                printf("b is %d\n", pshreRAM->b);% A( ^2 Q  _7 D# M: \* p" H
                printf("count is %d\n", pshreRAM->packet_cout);& [0 D$ |7 T. L9 r+ d( Z
                count_copy = pshreRAM->packet_cout;% G$ G$ ^* |8 {' [* Y( s. g
        }* S. ^$ M/ H" d$ G
        else
  b8 r. R4 |0 Z/ t- ~7 l) P" Z        {
9 W- n& B/ U( p- }6 v) ^                printf("No effective message!\n");2 T/ k1 E8 m. N# ~( S
        }, X$ Y: |$ x$ w* O$ {* a
}
& F* _4 Y' N7 }
4 ~  A; ?+ p) w+ G2 \: A没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???2 ^7 X; l* G& f, A5 Y

4 r( ~4 q' p: X6 e4 I4 Q
# M) N# ~+ G, c
3 m% d5 u. u& f$ o8 A/ d' L
/ \" V" P8 N& N8 |* g, C




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