嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 k( g7 p4 @0 A7 O0 V* a0 u! M! g

- A; _; P4 q1 J% q. L) }OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" y0 @5 q" x0 \6 |7 T#include <unistd.h>
' _9 ]* A/ ^$ B# v9 ^: J" x#include <sys/mman.h>; z# ^1 S. [# m  e/ ]! d4 M/ a
#include <sys/types.h>
: X3 E- l# o4 ^7 `$ {#include <fcntl.h>
1 j- x/ S, |) r: g! `  K
& x3 G; I+ s. I* `0 i#define SHAER_RAM_BASE_ADDR    (0x80000000)   % U& ]& ^. g! Z

  T2 c5 `5 `* l% l, Ztypedef struct) U! r% U( K5 d, f! [0 B2 V
{  ~2 ~* K+ ?7 j' c
        unsigned int a;
! `5 S; C) b8 K1 ^& S1 d* r, v- M        unsigned int b;" N5 _) ~. T2 X
        unsigned int packet_cout;0 B: W) t/ _6 [* a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  K* r, O% i, I1 Y. I+ E0 L
- S5 Z; A0 k9 h0 k  A! w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" M' Z& c3 ?: Q- o$ Y3 ?unsigned int count_copy = 0;/ U8 Y# \" }. e3 y% ]  D3 N/ {8 I

3 v& l: Z" n' q9 F! `7 `1 t! J4 J; E6 h4 _4 S
int main(): s) b- j7 g% i; N6 _+ _
{" L. [* X7 ]9 \3 g: i
        pRX_MSG_PROTOCOL pshreRAM = NULL;2 E3 `9 J1 ^8 [9 t% _
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, p* G- K& g1 x5 U3 x7 ]& I
* c! @# ]5 ~- c; Y/ w3 z
        while(1)
; i! N. F* k# z8 E4 J+ e! ]; i6 G        {
, I+ D: u( q( V8 s. A7 m                read_MSG_buffer(pshreRAM);
8 ]6 J9 b: B- W: l% J        }               
" K  ^  Y: |% Y: w$ O}/ ^6 |- s- @' L
6 C- ?  E! X- v2 f8 O0 |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( W2 W. ^6 Y7 P' ]! w$ W{
. ]' ^# f9 C0 h& V5 u        RX_MSG_PROTOCOL buf;
: h: k4 H9 o6 q6 x/ G( s/ b( M! p6 z        0 N; x* r; ~1 z4 D! ?9 E" @
        buf.a = pshreRAM->a;, M7 e- c8 P$ i; U7 M  v% h( A6 t3 w
        buf.b = pshreRAM->b;3 o% M# r1 G: c. |; t
        buf.packet_cout = pshreRAM->packet_cout;1 q$ @7 g+ ^) e$ ^; R' g" c
        2 r# J, R2 T' s; U1 L8 L
        if(buf.packet_cout != count_copy)5 ^6 V8 P, U5 [, `
        {4 ]: F1 P. Z9 `6 R' k* N7 W
                printf("a is %d\n", buf.a);
* Q7 {) ~! l0 y                printf("b is %d\n", buf.b);  e; j, X0 h$ R7 {
                printf("count is %d\n", buf.packet_cout);
: Z6 X0 f2 W# q5 E1 [8 o1 B+ J% P                count_copy = buf.packet_cout;
$ t- Q: b1 U6 v7 q8 n        }
+ d1 A' o: l! G: B9 I        else& f; b# s7 C  |6 v2 t6 V
        {
& L" D# m2 M- s6 I' Z2 Z                printf("No effective message!");8 Y' ^( `5 J* S* W6 F* J) @. w) g4 h
        }
: n5 z! c- h# c  q% k1 F7 O1 V; o}* q9 F- Y% l/ Y/ x
9 Y. z) E: M7 m. M% h

) N! g7 [5 Q0 H/ a但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 k: S- p. A7 R使用下面代码,对内存使用了mmap函数后:. K" I7 D5 o! Q4 J* t. n" I
#include <stdio.h>
& T" k% R2 V0 O5 i4 m# @#include <unistd.h>, r- ?4 `! A% E2 L" o
#include <sys/mman.h>. w2 t5 {* n3 `* m
#include <sys/types.h>/ U) y2 l7 t6 A" i, {9 N
#include <fcntl.h>
% J1 d! F* V3 B6 V1 ~* e+ }  c- ]# G+ w# q) I. u; t
#define SHAER_RAM_BASE_ADDR    (0x80000000)
6 @7 u! Y& O) e1 t( z+ c#define SHAER_RAM_SIZE         (0x20000)   
! r: {4 n9 r: G7 w+ O
, Z" j9 Q+ Y' g5 h* p/ ztypedef struct  ~1 C7 F: J; w0 e; g
{
  ^* h. ~5 ?, P" M3 Z- I        unsigned int a;
3 c& R0 l+ J6 e  n  i        unsigned int b;; m* t8 m$ X- U# \; A$ K) f+ b- R
        unsigned int packet_cout;
* J: h9 H0 u' n2 ]; V* ~0 e, r' E& `}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% ^# O* X0 }9 [' I( {1 y

/ T# S2 U" ~  s( ]- L8 Ovoid read_MSG_buffer(int *baseaddr);9 {* Z# P  h8 C/ s+ Z
unsigned int count_copy = 0;7 r) S  @( T) {2 w# J) K; h

" E+ Q' D  Y4 i3 k- cint main()  p( ^6 H3 d' n3 A, V0 a
{
. ~9 N8 N6 u8 V) |% V% y        int fd;$ _$ V5 b( V) w: \$ X
        int *mem = NULL;
  b$ Q& K6 d! c0 S9 w3 k2 \! l1 Z% R. D' q
        if((fd = open("/dev/mem", O_RDWR)) <0)
, j2 d$ \; k" T1 q- z, {. v! R) T        {4 ~4 a& z2 u* T8 v; e0 w# ~
                perror("open error");
' x) J+ U. W& i. z                return -1;
* H; v1 X' _4 K2 `        }
* l, T- L/ A5 ]; N; p6 ~        - v0 M9 H6 E1 K/ l. A
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% Y1 h( R3 Y' f. T
+ g" U) o0 F3 U6 Z5 P, W& Q9 R        while(1)# ^! s. B: ~! z/ x2 B! E( ^5 f# T' j6 K$ g
        {
& ^$ ?1 g/ C! U, |7 C( K                read_MSG_buffer(mem);# M& B9 p$ E3 z; \, t3 C- f9 }! }
        }               
% R4 c8 M2 K4 L7 S}$ x8 T: Y6 n, g) A+ I3 ~& }

5 K4 y) c# ~( D5 n+ {/ uvoid read_MSG_buffer(int *baseaddr)
$ L; a/ v4 ?( I: n: \{
; S$ z; `4 e7 o8 W, B        pRX_MSG_PROTOCOL pshreRAM = NULL;
) r1 I7 ~7 m$ q/ }$ q7 q+ F/ E3 e3 E) T, P
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ G  M8 d5 |4 Z4 {7 P% H& r

( F5 ~  M- e' \# |5 j/ F) R        if(pshreRAM->packet_cout != count_copy): G+ i1 R$ \6 ]% E8 J" [
        {4 {& v& @+ x. w3 A; L
                printf("a is %d\n", pshreRAM->a);. @# \7 L9 \( h* e7 `" m& s
                printf("b is %d\n", pshreRAM->b);3 R( H# s5 E: C( ]7 |9 n2 I9 x
                printf("count is %d\n", pshreRAM->packet_cout);
# ]+ H& b# Z) P                count_copy = pshreRAM->packet_cout;$ {2 T, Y$ n  h! S; i
        }
: K/ n# ^7 @: f9 K# H" x        else7 y1 k3 W) g( w  G1 q
        {8 O. z  O" ]# X
                printf("No effective message!\n");# u: F! p7 \! b) k  C6 i1 o, b
        }& c/ `% E' Q8 h" {& {) W
}
2 ?0 J7 l' g" H' u5 c( k0 I, T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 G# g3 a0 H+ l0 b6 U( g! p

! `. F' u' ~3 }# T4 O- L0 a& W( L( f4 d) Y- b, C2 o7 l
8 q3 L' J- }/ O! U$ U" ~
! j9 ^! n$ T' x





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