嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- D  }+ U/ J/ p9 K! _( ?. O% M7 b  f5 C; C# U7 l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
  j! h' I5 B& m, e% o' d+ G) a#include <unistd.h>
7 ?, ]6 Z: M7 ^7 o#include <sys/mman.h>1 V- i. f4 ^  D
#include <sys/types.h>) C" o: d6 R, v& h/ z: ?- S! P  L6 ~
#include <fcntl.h>2 @& h# Y& x  k4 s9 U7 f

% Y5 z! h, j1 U" l- e$ Y" |$ {; L#define SHAER_RAM_BASE_ADDR    (0x80000000)   
  l; i/ }" L' |1 v- M( {' M
4 R& N+ Z0 L0 f4 A9 ytypedef struct4 p5 M7 M5 H: h" l6 s
{
4 n+ w$ h* C0 I        unsigned int a;# t: ?; B; t4 X* ]$ R
        unsigned int b;& h  o9 j( L  ?/ p! v8 G5 ]
        unsigned int packet_cout;- Q, |1 u7 h- n" b, l0 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 g5 L$ Q7 V- J7 J
. K2 Z6 {" b/ n+ |% w8 J! |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* w, X0 c0 ?2 yunsigned int count_copy = 0;: L1 C" ?) A( u% M1 q
6 Z7 Q/ k4 @) n: }& _

; e. ~7 y4 Q" i' D$ A6 v' _, E" ~int main()2 A; i6 [+ s! g9 c; f# d
{
6 a* g6 y# I. J# @/ H" H: T  b        pRX_MSG_PROTOCOL pshreRAM = NULL;& b- c- ~" K7 c+ V* ]" y) X
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) D, k; B' d) U; U0 a9 K! y
) R% p3 p' e  c: \3 X' c        while(1)
1 R  e' _: |6 b0 J& s. P8 V' p. u        {! T, J5 q! L" L6 |7 w) v* j
                read_MSG_buffer(pshreRAM);- u& z" U0 Q! w* r- [
        }               
+ X5 u4 A( g0 x}9 o  \8 q1 W: k1 L; M+ N
* I; ~4 R2 k* S" ^6 r$ F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 `& x: G- \  x9 q{7 S  h, U1 ~" W$ e$ ^& J, i2 @
        RX_MSG_PROTOCOL buf;
3 |# X7 \1 ~. q+ _5 o, X3 w5 P        
" f) q' s& }# D; T. [, s; c) \9 ]        buf.a = pshreRAM->a;. ?: T: _% T: c& d( m
        buf.b = pshreRAM->b;
% ?# u, D- }+ R        buf.packet_cout = pshreRAM->packet_cout;8 R* @7 V' U- s" R. j
        
! J/ s/ i7 O4 _' P        if(buf.packet_cout != count_copy). x6 |2 y( t) G2 h9 H5 B
        {
0 ?5 W# ^' S- B+ p$ h                printf("a is %d\n", buf.a);2 Q0 `$ s4 U, ^
                printf("b is %d\n", buf.b);
' V% e* c9 W9 r. r5 X$ t                printf("count is %d\n", buf.packet_cout);
( ^. `5 K/ U1 W0 f0 }3 H- H                count_copy = buf.packet_cout;
- `; l$ _( R) X5 m: W6 j! C, \& V        }
3 `( _& Q/ w$ Z1 E: V        else
) q* p8 P# v5 e1 V7 `        {) R- @" f. J1 Q1 L5 z
                printf("No effective message!");
# c3 x1 E- D  i6 H        }
1 W' ^9 a* k8 p1 |- \4 I! F0 R, s3 j' ]}- f3 F9 Q& c  T: F

* M- w! _* a$ [1 L
/ W9 e2 O/ o2 ]$ R7 h) _但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" ~& k! n; y$ e" u; J* m7 B使用下面代码,对内存使用了mmap函数后:) |- z, k9 ]% T4 T& h+ Q& S) t
#include <stdio.h>' E) _! }( H8 l5 r# I6 e- i
#include <unistd.h>0 J; w" r* O9 t. I  A! Y8 j
#include <sys/mman.h>
( [! F8 e) r9 m( M#include <sys/types.h>- P3 i4 F6 k8 E- c
#include <fcntl.h>
6 V1 y6 f; y" _+ s
& [- S5 T$ a. |& w* d#define SHAER_RAM_BASE_ADDR    (0x80000000)' w7 c' s% i6 u7 I
#define SHAER_RAM_SIZE         (0x20000)   6 r: O6 {2 j# d/ R  U/ U0 R# C
0 I7 j8 c- A+ }9 v" N2 C. y
typedef struct+ Y' I' x. v. A0 Z( x
{% T" _" A+ |- q
        unsigned int a;1 ]+ X7 `$ s5 P, N
        unsigned int b;' R( M* v) G* @! N8 G
        unsigned int packet_cout;
. o8 {. @- T9 y$ h2 j" @& K0 k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( F& z, M& r, Q) K( M
- T) ]/ \+ p2 ^, A. b
void read_MSG_buffer(int *baseaddr);& [, d# `7 b0 z) n- E
unsigned int count_copy = 0;1 `* K$ O3 T6 }1 b
, O5 e! {- W: u! Q7 q+ H
int main()
* [% X1 g  m% e3 C& k1 A{
; b) A; K' Z8 t7 U' y! N        int fd;
  ?! |. j- v2 Y6 r: }3 ?! `% s+ S7 A: L        int *mem = NULL;
0 G' J& W) W: s) d( V8 ]6 Y. Q: b0 a2 `* W/ ]' [
        if((fd = open("/dev/mem", O_RDWR)) <0)6 O( {6 s5 ?9 v
        {
6 d1 P3 ?5 t5 {4 Z% u& i+ C6 }0 ^0 r, ?                perror("open error");6 y) ?/ E+ M( ]* C
                return -1;7 m. w9 c0 Z& c" P  w4 Q
        }& R% K& F3 @( S. q6 C2 Y/ ?
        
& A1 e( K4 i# S0 w1 n        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 m2 P! ^6 l! J9 @0 Q" N

; k6 G2 N, Z. `        while(1)- }' s1 _% n) j  X; G
        {
& w3 F1 v# B, x9 F: [* a# {+ R/ N                read_MSG_buffer(mem);
3 b( U. F2 E9 ]2 {2 Q4 Q        }               
4 N( R: O* K6 r; F}$ ?$ q+ W. e& [; u6 ]2 \5 {

9 B! {7 }$ p  I& _, H4 o; D9 k- T& Zvoid read_MSG_buffer(int *baseaddr)
9 h# w' n1 _$ E$ a. z8 C# X{
; c0 ~8 B, v& y! d* u        pRX_MSG_PROTOCOL pshreRAM = NULL;
& Q$ _. `4 d- ~
3 w7 Q2 c! y: S4 f& R1 L( v        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! L/ s! I' u& e- X" B, Y0 J$ G% a: Y5 |% K' ^- P
        if(pshreRAM->packet_cout != count_copy)
4 W8 F; G  }, T- R; A4 {2 B        {
: m7 R+ }6 W" @7 t, U6 L. B                printf("a is %d\n", pshreRAM->a);
7 i0 _( Y2 G3 K" U( C9 m2 I5 u7 G                printf("b is %d\n", pshreRAM->b);
% M% ?1 Z* u) @  J- d                printf("count is %d\n", pshreRAM->packet_cout);6 M$ L) m* [3 m. A, j5 N9 _+ Z
                count_copy = pshreRAM->packet_cout;
3 N2 w- v4 A9 b  X# z5 j        }6 s, z9 r) k" m% U# I! P. ^! p
        else" F; T4 l. d  g1 s7 c
        {; H& d- I3 W" ?0 b7 E5 X5 N3 o
                printf("No effective message!\n");7 m3 P" a2 X# i9 i
        }. ]& h( V: S* w  ^6 `6 H
}
* p3 L" f6 [/ f& J. ]- {& j1 G# A3 C% n. @! G7 H' M
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) K! X! h9 z9 ]
2 u2 ~1 [6 I& I, s$ j8 V
, g# Z5 B# c: ^

: C- z% L# p+ k
8 B3 b/ D5 ]) S' w: O6 f9 i




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