嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : m8 A9 {$ o  i2 _6 ?! Q5 w# B
6 m1 q3 [: C* N8 H' @4 [: K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: d- h. ^. U+ H7 ?# Y
#include <unistd.h>0 f; P, C6 p. V7 t( _" d) n" O" R
#include <sys/mman.h># Q; s& Y; Z0 Y5 v
#include <sys/types.h>: I4 P# R4 }. [! y. a$ [- A
#include <fcntl.h>* \6 t/ S6 y( A4 c6 A+ F$ }8 O

4 r2 {( v1 l; i# R  t- r#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 N, S- V" t6 ]5 {9 s3 p* l, p, |% r
typedef struct
1 `* a8 h) o8 q! c1 R+ x4 k{
5 ~# t1 X  T* ?" K        unsigned int a;
8 ~# W* `# }1 }1 z5 S        unsigned int b;% J5 M+ I) P4 f
        unsigned int packet_cout;
3 g2 ]* S6 u, F7 T' M( t" C}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  B5 ~* n8 c: S$ }7 I2 Q/ J0 {; N1 X# W: @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( f  p5 }3 M, v( O
unsigned int count_copy = 0;) e( {& T9 U& {6 H2 \7 u

+ c1 e/ C* @( x* I- f: J
# w- b* z3 I$ S' |8 E& [/ iint main()% y3 \! j: ]% I0 i
{" P  m! M$ |/ n. w2 d' q
        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ m4 |- y+ r) c6 k7 @  q        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 L/ g; T* P' R% E; I/ V# |. Y1 F3 g- z5 u
        while(1)
$ W+ c9 N" {0 Z# V+ X: i4 z" H        {" G; G' k) E, ?) ?- G
                read_MSG_buffer(pshreRAM);
' N) H$ z( X, o( T. p        }               
: f$ c( `; `2 \0 S5 e}
0 q& E6 u) n, x! W
1 x2 [$ |- M# f& J2 b- Zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 Z0 G! A- D7 L7 S' Y
{- z+ p+ w' x, u% Y/ h! }3 i6 w3 T) i
        RX_MSG_PROTOCOL buf;
' N: b, F) C& u" r1 T          _, D/ q' i0 j1 M7 A
        buf.a = pshreRAM->a;
- i; t9 f; H1 F% p5 Z9 [9 }        buf.b = pshreRAM->b;, U1 g& Q% b: R; j
        buf.packet_cout = pshreRAM->packet_cout;) @( M, Q3 u  j" [
          s7 u, q# z, T
        if(buf.packet_cout != count_copy)
& b1 I3 h! v3 H/ U. f1 y        {
/ n2 ^; {$ k. R1 ]$ ?* w8 P5 }                printf("a is %d\n", buf.a);
/ [. e' |4 p# @9 {0 o5 j6 X9 ^                printf("b is %d\n", buf.b);, y3 J" H9 R2 e3 a8 E, U8 e2 t$ |# g0 V
                printf("count is %d\n", buf.packet_cout);0 P" _6 ]( A+ x* s# y5 O, e
                count_copy = buf.packet_cout;
6 u7 X  @* E1 e        }
* L  Y/ D. j+ [8 Y3 F' D( l        else
5 V4 u& R! \. m- Q' v        {
# ~2 [  [: u: x# h7 V8 E                printf("No effective message!");
7 r  E$ I4 c1 {9 d        }
, c/ t% |, V9 _. L( g0 l}" K: X6 h8 h. _8 q* l& G$ a/ @( U
- T* z4 D- Y- [9 y8 x
# `. U4 k6 E+ g7 y3 A1 \, ~8 M
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 W; a# S( s3 U# W
使用下面代码,对内存使用了mmap函数后:  w5 v& v) \1 v
#include <stdio.h>
  u$ k  |, O2 i1 W#include <unistd.h>/ k2 b- _4 u( U7 J/ Q4 _% l4 \, l
#include <sys/mman.h>3 l' a. }& k# ?. q8 W7 p4 W0 c: i
#include <sys/types.h>2 |: B9 Z4 K2 a6 z" V$ o' Z8 a
#include <fcntl.h>
9 x/ A0 o+ g* y5 w# g0 T- b* Q& q& A9 ?* T* d/ ^+ Q0 _6 T7 D
#define SHAER_RAM_BASE_ADDR    (0x80000000)
5 ]0 }7 f1 p9 {& t) c#define SHAER_RAM_SIZE         (0x20000)   # l- N5 e5 H. Z  a$ O# r

4 j. _8 E- j1 D8 C# @; Otypedef struct& W. M8 I3 H7 B% N/ z9 F8 A
{8 F6 [' g9 R% T5 o* r  ?! x
        unsigned int a;
! H7 s- \. q( s( f3 d$ g) C% z7 w8 {        unsigned int b;
' {9 ~$ B" n& F- N" ]$ U; }4 i/ a        unsigned int packet_cout;; Y/ J1 X8 n2 p) g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 N4 ~$ h9 @" t$ v& `7 ]- N7 L6 ^5 S3 A! V
void read_MSG_buffer(int *baseaddr);4 ~7 ~0 I/ z$ o  }$ M1 Y, d/ ?9 S) F# a
unsigned int count_copy = 0;
$ N3 n8 `% _9 z, ^2 C/ h* q
! E% D) S4 W# O0 \7 `int main()' v5 i: ?) j6 B+ i5 Y% [
{
5 b  x( q, k0 \/ E. K3 B1 s  M        int fd;
7 G4 x$ K3 }$ R# J        int *mem = NULL;
: Z" {: _$ ^1 [* w
6 V2 ^; L9 g$ y% j        if((fd = open("/dev/mem", O_RDWR)) <0)8 X, R3 m5 S/ q4 M$ w& y
        {
7 l3 l' ~- I) I6 b4 M1 v' C                perror("open error");
5 i' U8 o; L! \9 k4 D  E& |- O) s                return -1;8 \+ c* K. ~3 v% ?0 `
        }: p( X3 e8 U' C3 O; E* y4 B
        4 ~# h- S1 v. L% Q* ]1 _
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; G3 \# r# i4 W" A
0 ]. n; D. A) B1 U4 h0 V1 B2 J$ R/ e
        while(1)$ Y( Q7 w" W; N+ F
        {
% w/ U/ }2 H( L$ c/ W5 U' d                read_MSG_buffer(mem);: z/ T# s( }1 d& C
        }                . _! ]1 [% P8 J/ @( J2 M+ u9 n
}
2 o2 _/ h3 v  @. c
3 Q5 \3 w8 o3 i% u  T4 avoid read_MSG_buffer(int *baseaddr)3 }! p! }! X% O; ~: v
{$ q, @, v( s% B  z. X5 {( _# d9 B
        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 P5 y! i. |! y& x2 I1 @- D" v! c$ B* [4 F8 a1 {1 i
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! _% ?1 w  R  M, S2 ?) w$ C! f9 l6 @% f) R+ I" x& [
        if(pshreRAM->packet_cout != count_copy)
0 W& ]1 A' G: J7 d% M( ]        {
/ ~# E/ J7 |' n- F6 j4 C+ J- h                printf("a is %d\n", pshreRAM->a);
! D" n7 a/ E$ P0 f$ |8 @( c) {/ x/ s7 H                printf("b is %d\n", pshreRAM->b);
5 y* ~; l/ f- v& d7 [2 A                printf("count is %d\n", pshreRAM->packet_cout);
1 z6 Y$ u( s( G+ m& W                count_copy = pshreRAM->packet_cout;6 f( J! u; s2 X5 h9 P9 \
        }' U- O/ x9 g8 U( n# [
        else
' w+ F. o) H; ^6 M, V/ N4 }        {
) N: W& l- E$ Z- c$ `6 \, }                printf("No effective message!\n");  i. D" O1 C6 t( u2 X% p
        }- W; H' h' }* P
}
( P7 a& n. d4 o$ z& B1 t4 o! `- B6 B) k
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! M/ a6 z% t+ Z& ~# w0 d

* Y4 i0 Q6 b6 i0 |* j. |: q! a3 E/ u8 I6 W) F; m+ E1 \
3 u$ r/ {# A0 g* {

: S( n3 O; k+ t: ]; V, Q% W: N6 v$ O




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