嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# o1 j- N9 z# Y' h- w+ u
/ ?% m# W9 a! k7 T- F% KOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" |% C# _$ Y$ L#include <unistd.h>
* E1 Q6 j; j% [) _+ |1 W' O#include <sys/mman.h>( z( b3 r* y2 O1 o: O. V
#include <sys/types.h>
9 l* ~# Q. @, i+ a2 _+ w! O#include <fcntl.h>
% h, J1 o5 Y( T3 K/ ?+ W! F% s+ I6 P% S! ~& F1 ]$ F4 x/ |
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
+ v4 I6 z' g% }# k6 N. F1 G( x" t* p' G3 M
typedef struct# D9 {" g- q$ t- a
{9 U8 V  i& G$ s( H5 D
        unsigned int a;
, U1 ?* N; j( x& q+ K        unsigned int b;
% w+ b4 ?+ Q4 k& ~' N        unsigned int packet_cout;
1 w& k3 R- q# S8 q! N$ r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( [0 M3 Z2 K) Z3 [8 P
$ y* M( e# `2 w$ ]! w4 \3 A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 b2 x& S7 I- U8 d/ @0 v; funsigned int count_copy = 0;
/ v- ~4 J* q# @! f& B8 E3 D& m; `/ Q8 k$ S
: j- t$ o1 ~4 B
int main()) f+ O' ?0 n$ P3 O$ q. l
{
% U6 v: E* ?3 m+ J+ p6 d        pRX_MSG_PROTOCOL pshreRAM = NULL;
. g& S8 f% g: D        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% ?, |# ]7 N6 p, @3 B6 O' a. E1 m/ x% L6 u+ c
        while(1)$ g$ }+ Y6 k, B0 Q
        {
$ R( c  i9 G. C0 M2 ^+ W                read_MSG_buffer(pshreRAM);
* p  }- {$ r- G% @( }        }               
4 B6 t, J- N" o4 i4 ^- O}# A) F; @/ z1 j* G' j

$ P" \9 R9 q9 M9 F/ P: W" @: Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 \  {* T6 m' S. C
{1 A# R3 e4 z: H8 D1 |+ j3 |
        RX_MSG_PROTOCOL buf;! U: W; T. F! k" y2 g1 S
        
* E9 C1 f5 h& h; }5 M/ T# j( h        buf.a = pshreRAM->a;
3 ^' N! T( i' S9 _- Z, Y1 s1 W        buf.b = pshreRAM->b;
3 t0 t* _* G; i  D, ?$ {        buf.packet_cout = pshreRAM->packet_cout;1 J( ?" n/ \  T1 e3 E, @5 E- A8 H: X
        
" Z0 N- j1 u9 T0 T6 b2 j1 a        if(buf.packet_cout != count_copy): x9 i$ w. Q9 J4 ?# W' h; }+ d
        {
: V' ~  U& p: ^& n; c/ h5 K                printf("a is %d\n", buf.a);% i" l7 S1 p& ]& q$ H, I
                printf("b is %d\n", buf.b);9 [1 \- s( o2 X, L( Z
                printf("count is %d\n", buf.packet_cout);* [. y& f( b) x% H7 B1 g
                count_copy = buf.packet_cout;) f- B9 @0 g- r/ a7 \& z4 Z
        }
3 V( Y) C6 ^0 b+ n% ?+ q        else* W8 ]- R( e7 V  h! H7 E( c0 ~. b
        {+ Q/ D4 f+ A/ H7 ~7 u% ~
                printf("No effective message!");% \$ b2 s) F$ Z5 d/ _) Y3 ?
        }
, e# n& r/ A% m- X! u}
3 q+ [7 S) b/ o1 u$ L! c% X% m: U$ T- u# Y1 x8 H: \1 c& K

) s8 o% n! d* Z+ k) B4 @但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 q  ~; U, J% n0 @9 G9 ~
使用下面代码,对内存使用了mmap函数后:( W6 A9 h% W7 _& r) A1 f# d4 D) c
#include <stdio.h>
# w0 S% T6 D6 V2 r# v! U#include <unistd.h>1 b; A' d5 ]9 \
#include <sys/mman.h>
. h) n  W" s. [, }- z#include <sys/types.h>
) A" y( A+ I+ }#include <fcntl.h>
5 b6 e/ I- U% i) O7 M
0 g$ ~& a' m7 p: t* C#define SHAER_RAM_BASE_ADDR    (0x80000000)% [; T' {( [7 [# H6 w
#define SHAER_RAM_SIZE         (0x20000)   8 Z# k! f" @3 d* r( y
6 z( J8 e1 f# w6 _0 ?5 _7 @
typedef struct9 y3 U; x. x- n! {5 ^5 S
{
: x7 x# h* `9 X5 ]  g        unsigned int a;) q+ I* I7 t/ j3 Q8 V
        unsigned int b;# s3 h' [  r# n$ E4 o5 C! H
        unsigned int packet_cout;1 M7 R9 k+ |. J/ s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  V& u1 ^0 Z/ F' ]
3 W( @3 T/ J! S6 bvoid read_MSG_buffer(int *baseaddr);6 w1 x# |8 s3 N3 C
unsigned int count_copy = 0;  G8 |9 y: Q; _, o6 }6 a2 J

, t  w% L  f( V& v! u& oint main()
3 P. h6 F, Y# b# G{
1 {5 C  k  K( k- [        int fd;
6 `. Q' o  @; l( ^  E8 l$ g        int *mem = NULL;
+ ]* p" }! D8 I8 k& d
/ O' ], Y: b: N, |        if((fd = open("/dev/mem", O_RDWR)) <0)2 B; v; p. o! N+ o
        {
5 z# b; H3 e! K2 G& }; @  K                perror("open error");8 ]0 g( D9 f( l; e/ W: [$ T
                return -1;9 U. c* d0 g' a1 b/ E5 a. [
        }0 l+ [# Y, T" m" Y0 O5 M8 h
        
3 j, g* r7 s# v5 C& C/ i0 m        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# S( S3 w) Z* ^+ a, i, B

3 o+ ^+ h$ F: x+ T4 y  E        while(1)
* C) n0 X0 N- m" U; g" c        {* S# F: }1 F, [% q$ N$ g, ^  C  |6 i2 L
                read_MSG_buffer(mem);
' a% R9 M" m9 h! g        }                $ W% n4 k! ?. E2 L. U  b# a
}
1 X1 S: [$ i# y
# s) [9 g8 E1 h8 j! r* Q9 t8 Hvoid read_MSG_buffer(int *baseaddr)) n' H7 `- ^8 l& I8 P
{
. Z! P* E- n( x' q" M' K- Q        pRX_MSG_PROTOCOL pshreRAM = NULL;* t/ F+ z4 C  [

/ e# R' y& A. A3 q( L1 P5 L: F; b. P        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. n$ D5 I/ e6 y' Y1 d# d
% B" z& ~- Q/ K; K* C0 b% o        if(pshreRAM->packet_cout != count_copy)
7 T: g1 S- u; a4 U& P        {
0 D" O- X; F, i1 r3 i                printf("a is %d\n", pshreRAM->a);3 {4 N1 T5 i8 q' ]. I& z* }" C
                printf("b is %d\n", pshreRAM->b);
8 Y% t: T  _/ o+ W8 p: Q1 I8 s                printf("count is %d\n", pshreRAM->packet_cout);
7 z/ G  z/ Y: g                count_copy = pshreRAM->packet_cout;
, E2 ], m' V5 C# ^" k$ R        }% R& T8 x8 p7 v/ Y/ y3 A7 }
        else
5 ^8 M+ k" {: C9 p        {
4 t/ G& _3 ~& z" z3 N7 n* Z$ T                printf("No effective message!\n");! G) M+ Y8 l" X, N+ Q
        }, ?! Q# N: O0 n8 L# r
}4 d& l- [* |- K1 S1 t" w  k3 k

/ K/ e8 L8 s$ w, s" E3 D没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# A* ~8 F4 p5 {, J  ?, h$ ^/ v; ]* v/ x2 _4 R
3 S4 T: A7 ?+ }

- o9 p+ X, z$ v% S2 `' I$ C2 u& W0 T) c! a





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