嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& ]5 }8 m8 P" {7 ]& q' i3 Q- W/ h+ u3 _0 O) B; w/ M. r: p5 i, L+ E  e
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: [( H; `0 a3 L
#include <unistd.h>
* ?. z7 J/ T' e#include <sys/mman.h>- p$ X. ~5 `$ k$ H
#include <sys/types.h>  b6 ~* P' D, o; ~/ ~6 I: @, o
#include <fcntl.h>6 ^2 J8 z: O" `% Q6 z. I. C: J

( S" @8 m/ {" B! f6 S#define SHAER_RAM_BASE_ADDR    (0x80000000)   
( ]! w/ y$ A; E) e6 h4 i% A1 i5 X  O! n& B: C. n0 Q7 v; t$ s
typedef struct
6 {' A% D4 c2 [5 s- U{
! T% w* A& H7 N' M$ @$ |$ R7 A+ |. }        unsigned int a;3 R$ f5 o) I$ W7 S
        unsigned int b;
( J$ M' D" m* f  W        unsigned int packet_cout;
" O- s; I( p7 o# ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 \! I/ R+ v/ Y. u2 F' s

. P7 T5 f7 D; a, [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 `4 v/ F+ N  D- L; Q2 L  }unsigned int count_copy = 0;
  z1 x. o; }& _6 p& g; h% @. \) ~8 M
: [  x8 y+ Z/ X/ g2 J! R' g" i! H- K( }
int main()* ^% n5 x0 }% S) x3 O5 E$ l; U1 q
{" c; ^5 u% o# E" }
        pRX_MSG_PROTOCOL pshreRAM = NULL;, E; c6 S8 h  x  c6 E5 o& h/ k
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ k( ?' r7 b3 _& q8 k2 o

% W5 r; E9 F( O# L+ U  E& u# F        while(1)- z% A/ W7 \4 P- b! S6 `0 q
        {
: [' o7 e1 U2 t" q* ^% r                read_MSG_buffer(pshreRAM);
( ^' u- @0 [( ^0 b        }                1 _* P! _; Z) @% G
}
" s& R) \" J0 p3 h* Y: M
+ C1 C& |6 u6 ]; ]* }/ jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( O2 c1 Z3 c  q5 R/ I
{2 c2 Y( _. ~% r) l0 V' P
        RX_MSG_PROTOCOL buf;
, h6 W6 C0 F2 Q3 H- E# \. \        
5 k+ ~+ y  ?$ G* P, |        buf.a = pshreRAM->a;
. U$ [4 q0 `- n$ m% E, j        buf.b = pshreRAM->b;
0 e7 ?- ^- }" z% P* S+ \        buf.packet_cout = pshreRAM->packet_cout;
6 R$ t1 Z* r$ L# [        ' I9 i  a3 X. T0 m  [6 {
        if(buf.packet_cout != count_copy)$ _. j: v% Y& o# v5 D# l: R! K
        {) [6 \9 _/ [6 \$ }& q3 d; p- S
                printf("a is %d\n", buf.a);" i4 }; Q  [& F" v( C
                printf("b is %d\n", buf.b);
& t3 b, B" x0 g- o, l                printf("count is %d\n", buf.packet_cout);
& K- L2 W: Z" `6 V3 [                count_copy = buf.packet_cout;+ ~9 V# `3 n" Y# A7 C
        }
- X7 p* ]# h3 x        else
! U) G+ `! _# {2 f2 c8 F# F0 D        {
1 r2 m' ~1 Y0 h, |% C                printf("No effective message!");
4 R/ w4 e2 S: o; Y3 y* B        }
$ O, k. l9 m6 |2 n0 S}0 h& |4 D6 x9 v1 P$ ~5 ]

- [# N+ R- V2 C2 g6 i7 I2 j/ B" Z$ I: w+ u
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: l8 L6 J- w5 B: c0 `5 j7 E使用下面代码,对内存使用了mmap函数后:3 |$ k- C! D1 [) W+ ^; H
#include <stdio.h>
, v" D: @: P" U1 M6 V  @3 L6 e#include <unistd.h>
; a$ b6 z, f# p#include <sys/mman.h>
- Z& b" z( X1 n; ?9 w#include <sys/types.h>) l1 I& a+ G' ~  E5 N! b) h! o
#include <fcntl.h>7 ?7 j4 w" |5 p. @9 ?" H- e
! ^- N0 q& n, D4 E' _4 M+ \
#define SHAER_RAM_BASE_ADDR    (0x80000000)4 e: A& F8 i8 G  c
#define SHAER_RAM_SIZE         (0x20000)   
! U: T& R  S  k3 i5 D- B9 E
4 j: m- z/ m2 A9 g8 T) O! r7 Stypedef struct
2 {7 y* C1 n9 I# x, y4 g5 n/ u! B{
* g# K0 p) E' H6 w" H        unsigned int a;
& d- ?. d# t- g! U& H" Z        unsigned int b;) z: O. X/ i! T% D% A3 H2 n, `
        unsigned int packet_cout;' D/ k6 G" p6 h6 B6 j& E; l1 S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 {1 W3 B/ q1 d' q" b4 f# s  C/ Y  k8 R
void read_MSG_buffer(int *baseaddr);+ l) J+ U& V8 |( w# [. T5 P
unsigned int count_copy = 0;+ H+ X4 m6 r( z
2 ^9 a7 p8 j, n7 i* S( v3 c
int main()
* W' s4 W: \! I! F, y) l{$ x# P3 @" }3 U2 k
        int fd;
- ]# z. d; V0 c        int *mem = NULL;! W" W1 b, l5 Z( E! k

7 a, ^& D3 s7 w: i3 j        if((fd = open("/dev/mem", O_RDWR)) <0)- A. s+ V1 p  O' d
        {
) R9 k# H: g; x" \/ d8 y* C& F                perror("open error");6 h4 c6 V4 r  H+ J( S
                return -1;; q5 o3 U6 E# ]4 ^  e/ m/ d# L! w! e
        }  r3 M/ W# f  k+ L& h$ T/ m+ ~
        7 i) h/ L8 ^+ q4 A. p. f( f
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 h, ?5 s5 I: X4 ~! E
: |3 P  O: |* ~5 P% v' l        while(1)
4 t+ c& O  A- a- J0 i        {) I+ u. {7 \: D  ]8 N
                read_MSG_buffer(mem);! s1 \; U0 v6 u1 \
        }                - u5 C! X0 C: m: l
}
2 `# b6 h' Y1 i9 @6 q2 |6 H
" Z' ?( n/ Z# P# b# vvoid read_MSG_buffer(int *baseaddr)
# Z+ b( n! e* ^6 r2 t{* B& |; O4 U0 ?  \( j$ R: R
        pRX_MSG_PROTOCOL pshreRAM = NULL;0 Z. ?- @: h5 U$ |& q9 J& L3 P

' m* H. L% Q9 g5 {2 e5 W        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: p& v5 h% E: Z) f5 z0 i" ?
8 B: W% W! \- X! Z0 H; n: D
        if(pshreRAM->packet_cout != count_copy)7 w7 V0 i8 J, W$ d4 u# b
        {+ B% @% A8 @) i) q1 \! i
                printf("a is %d\n", pshreRAM->a);, G8 t; b- M9 W7 m9 P; K+ n2 \
                printf("b is %d\n", pshreRAM->b);9 u; @, ~  P7 N5 Y: x8 w( k8 C& B
                printf("count is %d\n", pshreRAM->packet_cout);4 H9 ?* V0 y& @0 R
                count_copy = pshreRAM->packet_cout;
/ P' j3 [4 O6 J7 d        }! x# E! i+ F3 @' r/ [
        else
  i+ c$ [+ h# T        {( k0 }/ S" n0 W: l
                printf("No effective message!\n");
9 U+ z9 \' K: B9 g2 {1 m        }' K$ P7 a9 `. d6 d
}
% }; _: D* B. M3 W2 B  x. r
! M% h9 w" c" {/ z6 o% N' \* ^/ c. X  w没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???+ i. Z7 V8 Z' S+ }- y
( ?; U) p6 \6 d, h8 g% s( b& B; A

& z: ^9 a8 Q% U  K
( [3 ]( A$ W( r+ z% [3 t
- u4 J5 g1 p0 D5 S7 Q




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