嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & V7 c- d$ a+ Z/ m8 W, z: S

  B; {& {9 w$ ]- w+ tOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& i! [$ G5 Q* ~1 q& p- a#include <unistd.h>
$ A+ i2 X3 S3 o; C* D9 b, V#include <sys/mman.h>5 Z1 @! W1 N* ]$ x7 L
#include <sys/types.h>. K% u2 ]: s( D" |2 W
#include <fcntl.h>
8 C3 O- |" v4 n  Z  U3 `% T/ a4 j* N% P& U2 o! g
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
+ V- y3 ?1 z2 I: E, g, ~5 D2 K- z& H4 v2 U4 |/ F' w0 y/ O
typedef struct
3 N* n+ i% i( G4 Z: Z{2 |$ p0 c* C/ E- \+ }" Y
        unsigned int a;% \7 G# T; E. e2 d  y5 _2 ]
        unsigned int b;
6 H! I2 Y3 r5 D% J        unsigned int packet_cout;* l9 C, f, ]' k4 B$ ^1 K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) a+ l# J* q: z0 x. R

- g/ o$ Q$ t0 pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# [3 w1 L. O/ ]. L/ Runsigned int count_copy = 0;
, W6 r, S/ U2 N8 p+ w7 ~; z0 ~
3 D$ Q4 A8 ^2 |( N% T' B) }
1 w5 ?5 |: `" @4 a* j" L* ^; Vint main()$ j& [. \! A0 J
{; E6 A! y+ O1 ?. V/ {# m5 k
        pRX_MSG_PROTOCOL pshreRAM = NULL;
- C9 C  P9 A1 X        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 v5 P2 K: V) h9 n, q& M( I
" g! K5 l5 v- }) H0 C        while(1)
" |6 z4 K$ _$ K6 W* J. p        {
! O  L9 p, \$ B9 v                read_MSG_buffer(pshreRAM);
$ W) b- ^( B' \& R; |2 p' q4 k. V7 A        }                : N/ G, h# S# C7 ?1 @' S
}! W6 g% T- h( n$ k. S) h$ P8 E

; w4 r$ N; w2 s+ [" Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 \& R8 a) A' C/ {# A
{4 |% y4 Q( O+ D. h  p% t/ |0 k
        RX_MSG_PROTOCOL buf;/ W$ @  \4 ?' U3 ]0 k2 G& F4 F) ?: J9 N
        + F$ F. {$ B, a0 d* Y, l" Z
        buf.a = pshreRAM->a;
0 X' L$ q4 A& s        buf.b = pshreRAM->b;4 d' N, o, r) p' l( Q
        buf.packet_cout = pshreRAM->packet_cout;9 y+ {* b! V& c7 t, e
        
* L* [% e, @1 g        if(buf.packet_cout != count_copy)
% w5 n, C/ F6 i' f; y        {
' H1 P( U4 g& P+ e- I# W                printf("a is %d\n", buf.a);
+ J' n# P& D0 O2 ~3 x! }* ~                printf("b is %d\n", buf.b);
2 r4 ~. j" a) s) M7 _                printf("count is %d\n", buf.packet_cout);, r& \, u) y% O2 D9 Z6 j' V6 E
                count_copy = buf.packet_cout;  s* |1 O+ ^. I& x4 z# d$ A
        }
. D  _& F3 Q% c/ s- W2 e1 r        else9 s+ H5 P9 {& Y5 K' N
        {
5 C( s$ y4 v5 T5 x& U' N                printf("No effective message!");
. K. _0 t1 M5 Q- t7 y; _9 [        }
2 O7 k: }1 x) G# V}2 m/ {! v6 y; }7 c

0 p. y: L# Y9 A% \* ^$ D8 c. X: o2 t2 B+ C4 c' C/ I0 W
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 Q) k) p+ @3 c: Y
使用下面代码,对内存使用了mmap函数后:3 a+ |( a1 d: x" |
#include <stdio.h>( X! V8 B7 g4 {+ H# ?' j/ i
#include <unistd.h>
2 ^  {+ K( H' P- b0 Q: Z! W; n#include <sys/mman.h>2 ]8 N$ W- ~& g/ T
#include <sys/types.h>
1 D1 c6 J$ v1 S" K/ S) O3 j#include <fcntl.h>
/ _3 M9 k" @& ^+ p3 s9 l6 F$ j
/ T7 ?3 a* H$ C* i#define SHAER_RAM_BASE_ADDR    (0x80000000)" }" w! M: z6 ^# ~& ~% X8 L
#define SHAER_RAM_SIZE         (0x20000)   . o) h; d  V5 D3 k7 g; ~. @  T
' K* W6 Z- J* z+ M* X
typedef struct/ B% A. @, q) ]
{3 A' |9 L0 Z/ W0 G
        unsigned int a;
$ c' {8 L* S5 [* f% `        unsigned int b;
! O4 f$ u. t9 i) e. C+ N( Q        unsigned int packet_cout;
4 G9 L$ K8 u& Z) a6 k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 b3 {7 ~. C/ b' B, ?5 |% n

, T1 _/ Z8 s" b3 q& y! B9 }  y8 uvoid read_MSG_buffer(int *baseaddr);
, \; k6 b) Q6 \% L3 Yunsigned int count_copy = 0;
  m5 ^) P% K1 _4 |$ `& A- I% N+ Y4 \  c! e
int main()
; U2 Q) H0 W. `' J% z. O{
- a. I% Z7 r8 r/ e: M" w3 s; I; p        int fd;4 Z" z" i7 b- ^. N
        int *mem = NULL;- I7 _( C  }6 P' |( p
+ c# M$ k7 N0 @
        if((fd = open("/dev/mem", O_RDWR)) <0)
: K7 ?+ B$ X8 f        {
! U" \: L4 N- r( Q                perror("open error");
, v8 p" W1 a; p8 C0 [: ^                return -1;
  p# Q& Z& P, q1 ^' A( ?; y- Q        }6 i5 _; h, V/ ]* u/ S
        
+ s3 I% ]) F/ _' q: ]+ V8 J! T4 x        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 B  \# p% x3 t$ G* p# b4 ]
! g/ f. S! _3 t* a& K+ ~% l$ g        while(1)8 L" R7 j% \+ D  G0 m
        {
4 W& J, ]) D2 ^9 L                read_MSG_buffer(mem);& g# I, D1 R" L" w  w
        }                3 N5 k- c/ e3 w: y: y
}
6 _4 C  y6 z# M. d' |2 y0 I* O  s( ?! E# A
void read_MSG_buffer(int *baseaddr)
: @- S7 E0 R2 H+ p/ w{
' x# _1 C4 V( @9 C& J- b. |( B        pRX_MSG_PROTOCOL pshreRAM = NULL;
* N% F7 o" K2 a* O
9 i; R( ^0 q7 W0 ]/ w        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# V1 k0 U$ w) }; O1 l+ i  F* s5 k

  I8 ]  B9 d$ T- f" y' J        if(pshreRAM->packet_cout != count_copy). b) b1 U; h1 R! b
        {/ e' N7 _0 _9 Z/ L
                printf("a is %d\n", pshreRAM->a);& c1 |* `" j& w! k3 _$ B7 c! ~
                printf("b is %d\n", pshreRAM->b);/ O- n  Y% o' p
                printf("count is %d\n", pshreRAM->packet_cout);4 q% _! ~4 y5 H0 P
                count_copy = pshreRAM->packet_cout;, `9 F) Q, g$ d
        }, `$ Q" \/ U0 L  j0 f1 a! S9 Z2 O8 c
        else
5 S( }( R2 e/ ~1 M* l% Q( L        {; S! _: N2 u; |# E% [) ]0 A
                printf("No effective message!\n");
  u8 T: h, C8 ?        }0 g* u# T: H: R0 S$ }- `1 I2 j! k
}
9 U2 `* }' p9 n- ]1 Q# ?% _4 t, v6 X, {' M) h$ J: }3 v; U6 H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: ~9 i+ T5 U* D7 \3 z3 k" e% k) e

- a) r8 S( {1 @! B4 S+ X4 l
+ z7 x9 S3 P1 [' }3 \$ W- p( d- {5 p2 A' _

, D& J& j0 F1 X) r1 o9 P- y




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