嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : O# G/ a$ p6 a: W5 E* t

, Y! ~+ q: z6 |' `5 d! G+ M+ h, w1 e8 _OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ E# N( ?4 F8 L$ v1 M+ P#include <unistd.h>
+ ]8 \) ^' h8 d#include <sys/mman.h>) K* V7 ~' N* y3 L. h
#include <sys/types.h>
) Z: t4 q; S; {5 N  k% B) f7 V#include <fcntl.h>$ D; [, _% P4 r' H& g
3 n) e) s  a- o
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
: [0 [) Q! u9 }& f
- G- l4 v8 h0 Y" ^% ~* C# E2 Ctypedef struct4 T$ [$ a! n& r" U0 [  j& o& b
{
9 h  o3 @  Z& q        unsigned int a;
! Z. \6 {, q" ?& C' p9 q0 Z        unsigned int b;% e! v6 V' d0 d  t* Y# ^
        unsigned int packet_cout;
6 @: i! t% r; T/ _: j" r; A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- Z1 \( T4 q1 U" E1 z9 O: c; e

, Y$ u$ u5 Z0 R% Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' Y* a8 [6 z+ h' a7 funsigned int count_copy = 0;
0 g7 z- I5 j$ W" }; u4 l: K! J0 B3 M% H7 Q+ k- p  ]

+ f; `2 W+ d8 K: J; g2 v; mint main()
9 S/ c* i$ q. D: z3 ]# ~# n& b" o{
& {' V6 ^: F7 j/ S, ]3 }4 Y* T% n, w' _        pRX_MSG_PROTOCOL pshreRAM = NULL;
: e+ J% a3 E# X        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ R9 B6 t6 b5 c5 f0 l
8 y( |5 J, y- x6 H        while(1)% W2 z5 O) U1 K) H& F
        {0 B  u: x6 n# r* U) Q. l
                read_MSG_buffer(pshreRAM);( C  z( `) O9 _: J# Z
        }                1 a3 q1 @: @  p( ?$ t. G( D' k
}4 }$ V7 t; `0 G/ u
: @) J/ f( c9 c) t3 q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ \1 D5 n# T9 u9 \{& u& d7 H; f1 ^, F9 R8 M
        RX_MSG_PROTOCOL buf;
) M& f$ K+ T, T0 B" L" d0 s+ u        , [1 z( U7 p, I2 ]
        buf.a = pshreRAM->a;
* c+ ?7 `8 O2 y2 Z+ \- z        buf.b = pshreRAM->b;
% `# x4 e0 G5 _        buf.packet_cout = pshreRAM->packet_cout;: K8 _( o0 o0 x
        # k2 E: g) ^9 N" T0 G4 {/ e
        if(buf.packet_cout != count_copy)
" V/ g7 [# j4 s1 T  a        {
1 g  e5 R. P/ h4 }                printf("a is %d\n", buf.a);
! D9 Q9 {* d$ B1 g                printf("b is %d\n", buf.b);1 I9 E' y# c* j* n# m
                printf("count is %d\n", buf.packet_cout);
" ~4 N8 q$ \4 L                count_copy = buf.packet_cout;; n, ~! ^: y1 n  ~# Z
        }
1 v) d8 f# {! b7 `" Y5 y, V. P        else
$ E6 C, v4 Q% v7 S$ M* t        {
* c" I# k. e5 l5 M# U8 E                printf("No effective message!");
" e' O# N; U$ B3 [& t" v        }
# r$ b/ D5 |2 y6 M6 \0 a}4 B6 _- o0 z, t
+ g/ K$ p3 S) U7 F2 m. s

9 f+ i, ^: B2 s% z  z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; m5 u$ u+ e7 R( ?
使用下面代码,对内存使用了mmap函数后:5 {3 F! ^& u" z) f
#include <stdio.h>* G& [+ U0 g% |' m/ L; m* U1 \
#include <unistd.h>; h3 F6 J) r' z5 p9 v
#include <sys/mman.h>% o% x3 o7 m- x. ~  g. q; U/ Z
#include <sys/types.h>
  x% b) ~; w( ^/ p* M#include <fcntl.h>
$ P! Q) q( }% y1 [/ k
) }9 i9 k. O6 m, o/ R, F$ _#define SHAER_RAM_BASE_ADDR    (0x80000000)5 N; B8 K0 i; O5 v+ H, l
#define SHAER_RAM_SIZE         (0x20000)   
+ L7 I# E+ M; x# x* n0 f4 ], E, M
# e5 R$ _' A& Etypedef struct
" b, n8 {1 N) c. Z, o2 z' d2 \{
- c4 {& D- y! @5 ~; U0 p        unsigned int a;
. G# X# ]$ y  D. o' o/ _. C/ f        unsigned int b;
6 H0 ^! w" s+ l& a0 C        unsigned int packet_cout;6 a. E3 V0 d% X2 l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 x3 T9 S' Z; r+ C3 Q5 R5 u3 `* d
) ]# Z' T$ X+ `8 O$ o+ P5 h8 w6 ]void read_MSG_buffer(int *baseaddr);# f; K) W7 u+ u$ c5 u  Y
unsigned int count_copy = 0;, n6 F' x. \+ t. p5 Q, y2 [3 l

; J$ y  D4 L1 R) v/ E$ X6 ]5 c6 dint main()  z' P" r- u! z9 ]
{
5 [. U( h, g! I; H# z* c" ]; p        int fd;
; n8 Y; a$ H# w$ E, D        int *mem = NULL;
) F+ N) N- a( a1 x+ ~
+ A, {% y: Z' S" Z7 v5 n; J" x        if((fd = open("/dev/mem", O_RDWR)) <0)
0 B. I1 A% @% a        {3 Y6 ~" a/ @6 k4 [
                perror("open error");
/ s( z, U$ k! U                return -1;4 `$ g+ i, P% T, H1 u' ^4 g
        }
" n! ?, l. s/ J) v+ z, ^. p        : }; S+ |! g  w& g6 Q( m6 q
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- M% W9 a# N6 F* P' a5 s9 g- y
5 ]8 t! w) {! J5 e: z        while(1)+ @$ Z5 {0 ]) w3 ~
        {
( y9 m( k' r+ ?2 c                read_MSG_buffer(mem);
+ X/ `/ k2 J* \+ W        }                5 J# r6 a: j& c6 b7 l! A2 G: G
}& o, P; o/ |8 l/ J# v
1 n: n5 I! P! S
void read_MSG_buffer(int *baseaddr)
- y/ t0 x0 u% a2 K$ g9 c, J% k{+ T9 ?4 I. G! b, O9 A2 Q
        pRX_MSG_PROTOCOL pshreRAM = NULL;% F6 M6 s: @7 ]- S' H6 [9 K) ~8 n& R- |6 z
  E/ y  [  B! i# s6 b
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; X% O/ W/ x! X1 m9 R
' }- g+ H7 r; b1 ~        if(pshreRAM->packet_cout != count_copy)* K, d0 u4 M  i" @! N) p8 `
        {
, F9 F8 S  X9 L2 ^$ U                printf("a is %d\n", pshreRAM->a);
3 W: J; Y5 P& Y9 P0 ~                printf("b is %d\n", pshreRAM->b);& C0 a! p4 p8 _; D5 i2 c
                printf("count is %d\n", pshreRAM->packet_cout);
0 u' v4 }. Q: B  G2 u7 K" g                count_copy = pshreRAM->packet_cout;
- k; S! N* [& y& K        }
8 {! b4 D( f" i; _4 ~8 c. Y        else
; G* w  F( O4 y1 ]- g% h        {6 {; s! p9 y! h  d: M
                printf("No effective message!\n");
* G, x3 ?6 L2 {7 [, |# t0 e        }  l4 X* l, i; T* v# h
}+ D& M4 Z& L) P# i& ~' R9 h

7 c, h( l3 ^3 Q( o7 C) j没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 I! s1 R& f6 a* Y/ t0 S  C. x' d: P7 V$ R
& i( g) O1 k  _+ W- b$ D

$ X! d/ A1 {8 R( C! T+ |6 t( P
" }. j- ]6 V  T$ Z* |) a




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