嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& o  I; K) @* G# o7 z
9 z/ A% k  w  @, {2 a+ dOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) r3 t6 l4 M" _& P  ]7 o7 W
#include <unistd.h>" q4 R% y0 W0 ^
#include <sys/mman.h>
" t; `0 j' B% c, `) @- R#include <sys/types.h>
& n$ o8 ~  \$ N, c#include <fcntl.h>
' Y3 y" O6 W7 U; y4 T4 W+ t
7 b) W. q) W; b" S' [3 P#define SHAER_RAM_BASE_ADDR    (0x80000000)   
: q4 v% g. T" ?2 X: P( A1 E# s& ~) n; C
typedef struct
1 ?' p  J5 ]! d{
' T' f/ s) x* R9 [        unsigned int a;
% ~$ t8 t# b6 `$ K# J- D        unsigned int b;" {2 _/ t, J  A3 o
        unsigned int packet_cout;( s5 Q2 B  T0 v9 i9 j4 Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# F* H1 y. d+ X2 a* u5 U

+ h4 s# E1 h; h# v: ?5 N9 A8 |$ Gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);! P; ?+ j$ L- N% Q
unsigned int count_copy = 0;
. a& g1 z9 L. r
% r' I6 x) k7 k; o& ]/ k# B
: p7 r+ H% n! [3 t! Qint main()
. ?6 ?4 t% `* W# I  ?* R7 T3 C$ @{1 O. p; R* V4 p# o& ~2 B8 R& @% V
        pRX_MSG_PROTOCOL pshreRAM = NULL;$ [2 j9 |" H. E6 {( L
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;: E, i+ a7 z  T8 H

9 y7 q, t0 I3 [$ ~4 O. j" v        while(1)
& y2 a; Q" m( A; O  A        {* A+ X( f/ S3 Y
                read_MSG_buffer(pshreRAM);& D6 d, Y' x% h  Q: r
        }               
' Y* s4 g) _: l) R) o}
6 |. d! Z& q  ]2 d* e7 ~
( g" Y( ]% o) q4 Q' m7 Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* u+ W5 L7 z+ g/ Q5 S{$ k" K" ~3 d9 _1 c
        RX_MSG_PROTOCOL buf;) b9 J2 M! X6 ^; `- V& {
        ! p0 t5 i' y) p9 w! c% p# \
        buf.a = pshreRAM->a;
4 C0 U9 f- t8 l& \! C0 C        buf.b = pshreRAM->b;
: ]9 p0 \* O5 |- F        buf.packet_cout = pshreRAM->packet_cout;
! m" u$ z2 b3 }/ w' D6 Y- z* A3 F        + j0 B0 m- }. Q3 x$ R
        if(buf.packet_cout != count_copy)
) R' m1 y6 S2 L$ [" i' m        {
7 o* d( j  I7 b. G" y8 _" Y, f                printf("a is %d\n", buf.a);7 x! R  [; t: h# m9 K9 h( @( m
                printf("b is %d\n", buf.b);
* S5 M2 I  e  X; R/ e& j                printf("count is %d\n", buf.packet_cout);
/ E$ o& L" z8 r" d                count_copy = buf.packet_cout;
1 A, U7 x: m  u5 u7 w! ?        }
: q+ [& {; {3 v% ^! i6 [  l9 G: i        else
1 ^, S/ r3 \' _        {, B0 r9 S% W- B4 t: p
                printf("No effective message!");
9 z& Z# J! E7 V; j        }
9 r' [% \  a4 D: T}2 L) V8 W2 J8 ?) H! I4 O' N" o

0 k5 n/ B3 R2 S( h7 D5 B" g% {8 v) R# }/ b' M+ i, X' K
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 A) ]4 m; E  c$ X: G7 {# V
使用下面代码,对内存使用了mmap函数后:
- s4 z8 K" M& M4 s' b( ?#include <stdio.h>2 ?  n5 C+ s: C* ]& \
#include <unistd.h>
$ N2 a- M) [: Z#include <sys/mman.h>
1 g; S$ z  K) O5 _9 _#include <sys/types.h>" O, ?1 N4 ?+ _5 e; r( p3 D
#include <fcntl.h>
0 g; |! Q1 O' O6 d1 d  c
  y" y: E3 X# k1 c6 J' o" L#define SHAER_RAM_BASE_ADDR    (0x80000000)$ @. G" X; x3 U* z" R7 ^
#define SHAER_RAM_SIZE         (0x20000)   
9 g( e. n; k- K( G% d2 J% i+ P7 Y0 B; u
typedef struct
* r8 Q* b4 F/ [3 T{5 N4 @" ~/ ]1 N: D! p2 S
        unsigned int a;
0 v' v! V3 x+ S8 c' t# f9 m8 Z        unsigned int b;! M3 ]9 Q% r& k4 H+ B
        unsigned int packet_cout;% X8 z. j8 Q6 l9 `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. z4 K8 |/ x  V# b/ @
& H0 m$ }- d7 f8 n
void read_MSG_buffer(int *baseaddr);
5 ~6 X/ j& k( r: r2 ]unsigned int count_copy = 0;0 Q  O& E7 R- b1 }" t/ |( j9 n
, J% D/ U. J( [6 H2 V2 ^9 r
int main()! z- o. @; r4 a, X  @- N
{
8 S  B) d8 W! _& O7 l2 ?/ K' |% m        int fd;, j% s& n# D5 D* A# e# n
        int *mem = NULL;6 b& X! a0 v- x) t
$ w9 }6 M' h3 [8 z
        if((fd = open("/dev/mem", O_RDWR)) <0)6 y8 f4 {6 }7 w& m  q% |7 D
        {/ {; A& U$ n" W7 O% l
                perror("open error");
( j2 G. g6 {) I: Q% z2 _& g                return -1;
! N* c: c) i7 Y        }
& Y3 A5 A% H" Q1 `' W        
3 |  t- F% p2 s9 p        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- g# H% c* y0 B$ R; W, ^: K

$ q* Z- |& `, U9 M) q        while(1)1 x) Z3 {& }) `/ f( K. S, e9 Z
        {  d$ |! p, {% B6 m7 H
                read_MSG_buffer(mem);
' f+ Z/ H, K- h3 ?        }                & o, M: z) M. b4 A( x
}( \. j- i$ p# F
9 i' d) F" A0 h5 c
void read_MSG_buffer(int *baseaddr)
9 D. H9 W# t/ e$ E) F{
& X, I) l5 b: R, u$ E) V8 M        pRX_MSG_PROTOCOL pshreRAM = NULL;1 W& B3 {1 z. W

3 \: t, x# [8 t4 G* u+ `5 ~& ^        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ h' w4 A8 ?+ i9 q
" M# t+ F! b1 w( g+ I9 d) c        if(pshreRAM->packet_cout != count_copy)
6 J" \# J: t# F# K4 D3 h2 {        {* a- H  V! n! h2 A; ?* m% c
                printf("a is %d\n", pshreRAM->a);# Y  C2 F9 |1 m) b4 ^/ ^2 O
                printf("b is %d\n", pshreRAM->b);1 B/ f2 e# Z/ p) u! C$ i3 O
                printf("count is %d\n", pshreRAM->packet_cout);
' c" q: z1 j' I* R% s8 K9 s                count_copy = pshreRAM->packet_cout;( V" t" c0 K8 b, d% \* c
        }
5 B* b4 B! _+ L+ K        else
4 F: d1 d4 P& s) ^- p8 k& V        {" {0 e# F9 O  a! A  E/ L
                printf("No effective message!\n");
% {- ?" I$ q6 R' _4 W        }
$ H/ C5 E5 S7 m4 G  b% g( y" M}7 V% ]- d; Y7 V8 [

0 m, z/ P) N9 v9 L7 ?5 L没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' k: a- c# Y2 A

- c( F! M( V  W0 H/ j
; S+ k5 g- ]/ g4 i# K
3 U6 u) g, i" e! X% W  ~+ j
6 k$ h1 i: O$ `1 i2 `




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