嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  r. J: }* g4 |; r- a( I$ ]- l- Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) U$ m2 S$ l- ^/ b' h
#include <unistd.h>9 E2 z& H3 h- L, I4 C
#include <sys/mman.h>
5 P  n7 I3 D/ v' t- n#include <sys/types.h>
2 b2 ]$ p, B) n* O0 F7 v- J2 o#include <fcntl.h>
0 q8 I3 X4 M' {* x' x6 i# |9 p/ o
0 y+ j6 e! [1 C6 @; T( l#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% S4 t0 L  ~% m$ S% N* ]/ H1 R
  K: g( I$ y6 V$ N( ltypedef struct
7 k- V, C& V* r& q( v& ~! s3 [: X{* a& G5 S# q& ]" K
        unsigned int a;
* t( t2 A3 J5 o6 K  i; ~        unsigned int b;
% u1 b+ L9 y; j# B6 A* b5 f9 k' r        unsigned int packet_cout;# l) N' U- n& R% v5 b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& B/ @1 Q! i( E8 X0 M

- e! c8 T' m- Z' k9 H5 u2 Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 Z& c9 q1 g3 i. d/ l/ n
unsigned int count_copy = 0;
6 N1 X; M% \) ^( Z) w/ m# J4 k9 F1 F2 E3 C! Z; k

  k( w1 U6 d( Qint main()1 m% H5 E$ t, ]$ B0 P
{0 d2 X( ~7 C5 H
        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 |; `! l' |& L" \% W- K        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) i8 F( O7 Y9 {6 l! J' `) H5 Q% I3 I! f6 P
8 V% n' J2 b( E; i. D# a' W, N        while(1)5 u! x( F# X% a+ o
        {, z8 w0 `, |3 y2 ~: T
                read_MSG_buffer(pshreRAM);7 w7 _: [. H, J7 _- _9 K+ O$ o
        }                " Z9 T% l. I0 v- P& `, C
}
: S) v3 C) C) C/ W" A7 j' ^5 F+ U" }0 z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 a, x2 g8 B. s* o{
7 M% a2 p% T1 r0 i# ]& d        RX_MSG_PROTOCOL buf;
  R' \, Y1 W% }1 b# N% d        
6 v4 r. F% x) {8 K" v        buf.a = pshreRAM->a;
) {6 u, W# X4 F9 K9 P# s        buf.b = pshreRAM->b;
/ t1 b' i! g: E/ ]        buf.packet_cout = pshreRAM->packet_cout;! E' F. _3 `/ ?3 }* r5 a. R
        
8 d& c; W" O# j3 U7 }- B/ F# e; p        if(buf.packet_cout != count_copy)
1 z  Z; r- V6 O- z; L1 w        {  F2 u$ d9 V+ i. O0 R6 ~" J
                printf("a is %d\n", buf.a);1 R; v! W& \: t1 z, H- A
                printf("b is %d\n", buf.b);$ f- g( }2 M/ p" L! N4 B
                printf("count is %d\n", buf.packet_cout);
. b1 ^$ v$ G) f+ I0 Q5 P                count_copy = buf.packet_cout;' D% y% c8 b, E3 D; f7 y$ D: N4 c
        }/ q% H" U2 `: ^4 Z3 b
        else  Z8 `8 |1 X5 S# e' ~
        {& B# Z& \. A+ g; K! R
                printf("No effective message!");1 o/ V% j" d7 N! v' d. n
        }
- M, p3 w1 l6 }- |! y+ Y7 M8 S}
* S% M3 a- E& v5 k
7 l! K2 V  O* s
9 t$ V2 n$ T9 z& b) C但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) z, M: z, G4 k) W$ _% q使用下面代码,对内存使用了mmap函数后:
$ ]0 }( |9 b3 \$ N#include <stdio.h>( \# ^6 f6 x% m2 I- `% d. S
#include <unistd.h>
! N% ~4 q- s$ B8 O$ L$ s6 P$ G#include <sys/mman.h>8 Y' Y  r. ~7 e4 E4 E
#include <sys/types.h>- K: y- m! U5 X+ C- u5 o) l+ j
#include <fcntl.h>4 P6 q" f8 r* K0 k* E3 J; _7 T, V

/ @7 v- ~" P9 G% u/ L8 X0 ~#define SHAER_RAM_BASE_ADDR    (0x80000000)* T: }9 [. L( e. X- [9 Y% L
#define SHAER_RAM_SIZE         (0x20000)   + B1 E5 C& P* v% W/ s# ?# }) D6 E

5 n; N5 r3 B4 J/ ^+ P1 n& etypedef struct; |5 a  m" z1 N! S; P3 F
{
, z* H2 k& _! W5 T        unsigned int a;* y' `/ X$ m8 Y, m
        unsigned int b;! j3 u6 ~1 @& i5 Q+ J! Q" u
        unsigned int packet_cout;9 ]2 I  I0 B3 ]9 P! {$ P& N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ D1 Y7 h( V8 t7 h: N8 \8 _( ^4 s

- r6 h: c: a# ?& X! v' J7 hvoid read_MSG_buffer(int *baseaddr);& f) v7 G4 p* @
unsigned int count_copy = 0;* g6 M* g3 D3 p2 l
% M" _- [$ O5 ]+ {
int main()
( A  ?  O. L& M2 s. ^7 Y{
/ L+ a4 y8 b8 Y+ {& O8 D        int fd;
/ W  e8 U8 W  Y$ a6 j1 T% m8 p9 z3 ^        int *mem = NULL;
( z: u6 I- b+ K3 }; y! N$ N" e2 {: ~' [7 _& U$ Y3 A
        if((fd = open("/dev/mem", O_RDWR)) <0)
; i% f/ y% @" j7 B- K' P2 }+ d        {
) @# ^& B, q9 K8 ^0 y+ m                perror("open error");& `5 y% ~+ g" ]: T5 v3 V+ P
                return -1;+ n/ Z7 B9 r: g3 t0 K% `& @3 t( K' s! f
        }
  B$ Z6 W: t: x; c7 W' y8 y        % A' J' i( C9 m- v
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 W* h1 J1 i" p1 F, Q

) k# {  U. w* X7 K5 L        while(1)3 X* B# I0 a. Q9 C- E# F1 O
        {. \) P3 }! d3 g- s: J  S
                read_MSG_buffer(mem);
  S- D, A! b7 ]& e2 A* g4 N0 f        }                ! I2 v" x# t; v% g9 `2 W& w2 r( b
}/ \8 n' ~6 M* g# l. o2 N

. }( ?3 \. O0 f$ l6 Rvoid read_MSG_buffer(int *baseaddr)
* j8 O8 F. [# s5 i{3 B% \5 N% w/ o0 {7 S
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  j" d8 ]+ }0 |: a
) Z4 K: ], A% |. S        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 Q) ^' }7 x5 ]2 f  ^* @* ~, S
  q! M) y) N2 ]' A& W4 R        if(pshreRAM->packet_cout != count_copy)) ]$ [1 ~1 I$ E3 `! Q1 z
        {
7 ^: I. w$ Q; G3 G! m                printf("a is %d\n", pshreRAM->a);
3 k$ b5 H' d* p5 Y% A                printf("b is %d\n", pshreRAM->b);( ]( X: x0 Q' @' U& F) y
                printf("count is %d\n", pshreRAM->packet_cout);2 w* R* M; \6 q3 n
                count_copy = pshreRAM->packet_cout;6 x# }6 f0 S# z+ K6 O# c2 X6 n$ x
        }! W9 [7 \" K' _9 ~0 b
        else9 G1 `, W2 f4 O- J$ w" C/ g
        {8 b' z3 L0 t# E3 U
                printf("No effective message!\n");0 R8 u$ P0 M+ l5 @3 _# z) c; ]; q
        }* u# G: ?  H; }6 N6 q' T
}
- Z8 _& c) Y) J' f5 f) O" j" ^: ?; u$ O# R5 l+ X9 O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" a# n. p+ e+ c1 M& \
2 {/ y0 }' F5 t4 ]
0 I9 k+ I9 S' j4 z- B' v0 {: k
0 @  }3 C$ `: {% a* k$ T$ Y5 g0 a" c





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