嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 R3 L2 `7 T7 Q* t% [5 G% B8 i' E* s4 |& c7 [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ a7 w: q0 [9 s8 o5 Q
#include <unistd.h>9 O! g+ s. S# j/ s. S
#include <sys/mman.h>" j  Z$ t+ b( G# m8 g
#include <sys/types.h>. W: K& s% L8 O7 A! U. E
#include <fcntl.h>
: g5 c* G) o1 G; k; x* z# t% U& I# E$ H- `
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 g% V$ N" y0 j6 @/ v
- Q8 Y0 C, |5 Y5 ~  ]+ Z- }3 {' P6 B6 Ltypedef struct
  K: W; r4 M# _{
9 |# L4 M) ^1 @! O% z$ P1 \        unsigned int a;
7 u' X& o* p. L- h# i1 ]: H        unsigned int b;6 }- G) v6 b; W
        unsigned int packet_cout;- X/ t/ x& |& L! U$ Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' `% a8 I; X1 R7 r% ^" v4 C: G" x/ N# e) A3 n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% ^  w6 n$ v: a" P+ Zunsigned int count_copy = 0;
) A" S) ]2 E" T) e' [3 B+ n/ C
; t+ e+ ]2 H/ `6 i1 ~$ |' H$ Q" J7 N* @! G
int main()
' f# W9 y" F* g  f' Z7 ]& J+ e& \{
* y7 X+ m; @& ?( Z; ~% c        pRX_MSG_PROTOCOL pshreRAM = NULL;. ~% E. i7 a+ |
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 [# z3 n* J# j' V: ^; i6 p- v0 T* Q( K, t! I: l  |2 l0 T" p
        while(1)# D. o- p- _1 @4 t0 Q
        {
) p! T( Y5 M+ ?+ d. S                read_MSG_buffer(pshreRAM);
' v9 u2 N! _6 g8 P& O        }                0 a: p" m  @$ r9 K; F
}
! P" i4 F, I* \% s4 P
7 P. e$ g$ ?, c, v4 ~void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ ?4 T! {$ _: F+ j' u# A% C{; `' m- `9 l/ Z4 f2 I& d
        RX_MSG_PROTOCOL buf;9 S4 b3 [$ T3 t& _9 D: ^
        2 L, {8 D0 r" \9 L+ N
        buf.a = pshreRAM->a;
* f" J  T% N- s  x2 F' ?- _7 a        buf.b = pshreRAM->b;
3 e( t4 g4 D/ M        buf.packet_cout = pshreRAM->packet_cout;. ~5 D) l: N+ N+ v4 c; u
        ) [; R. V0 M* S; S7 j  _' X
        if(buf.packet_cout != count_copy)
7 u$ g1 m5 y0 r0 u& e        {" |1 q7 v4 U, s* P0 }
                printf("a is %d\n", buf.a);4 a! z1 O  O# [- h2 f; r
                printf("b is %d\n", buf.b);7 q- A. I' {) V" `* R/ `- U, p- a
                printf("count is %d\n", buf.packet_cout);  a& O" ~. x; y7 L
                count_copy = buf.packet_cout;
! a, n% j" H3 W$ M        }
7 ?6 d% Z; I6 i5 ~  Z        else: l1 i1 |1 {2 Y+ Z
        {0 J* W0 G5 e: N1 x" c: W. S. |. {
                printf("No effective message!");
9 C' _' k# R. e9 Q7 z, b        }
7 \: `! O+ s. L6 q+ ^+ K* d}/ G& Y( T% t9 b& o

6 w& `; I( D$ j
$ v: z3 `' {' {2 A: O0 Z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  j/ k* d3 w; Q使用下面代码,对内存使用了mmap函数后:
8 \+ R. x- ~' w" Q#include <stdio.h>4 D. j' P! m5 L) b/ T5 |2 B% D
#include <unistd.h>
; T4 T2 E. o( K# g% G1 f#include <sys/mman.h>2 Q7 g# w/ t$ c4 Q
#include <sys/types.h>
- b! d& }$ s: c: p5 p- O" j$ s- }3 I#include <fcntl.h>% U3 P7 w6 G1 X
1 z' y1 N) Q. R! z& x2 e/ o6 S
#define SHAER_RAM_BASE_ADDR    (0x80000000)2 {: v4 H% Q: h
#define SHAER_RAM_SIZE         (0x20000)   
& m* u+ r0 y& \; K$ G8 Z* _5 p, j/ s7 F% `3 G6 F8 D
typedef struct5 U$ Y. D- X: b* F: x) p
{
) {$ a+ ?- j3 v3 z  o5 F        unsigned int a;
+ Q7 ~0 w9 o2 L! y4 y: z        unsigned int b;6 {6 R: ~+ B( F7 J
        unsigned int packet_cout;
# w2 n& y1 R: J# H  i) L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ |( o7 |. G! q, ^* n
2 ?* Q, t. ]& Q1 ~" A" r3 u( r& o
void read_MSG_buffer(int *baseaddr);, [5 A$ Y, X9 p& s2 l2 |
unsigned int count_copy = 0;
3 l* c1 c  r3 h* |7 K+ [
" p7 G; b7 F; Rint main()8 a5 k0 u% p. V! r' _
{+ p) r2 D4 [4 k6 K
        int fd;
; N7 }9 ?$ e, ]! s7 q4 @/ l4 Y        int *mem = NULL;& O6 X% R, {& E$ e; }; L$ t
4 @# a9 C' B" o; w6 R$ C
        if((fd = open("/dev/mem", O_RDWR)) <0)
$ U9 L6 W+ t/ k9 f  }        {
& Z+ g% T) N* Y+ [0 q                perror("open error");
- w( V' X/ a) k; N6 E9 F                return -1;
/ ~" N' g: ~1 ?; G5 ]) h& \" {: c" t        }
! n3 z0 N- V1 B" Q0 M        
5 B; ?/ e9 h& s5 H        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* p- i- Z7 E# w
6 p1 r& T2 _7 t/ U# h        while(1)0 _& M' _' b  g( z6 ~! T/ P
        {
! z* i* C8 r+ G/ [  L                read_MSG_buffer(mem);
) L% j2 t, _: S5 l        }                  l  I' v( u' H1 J2 k* f
}$ R. |* H* s" k% g# D
7 P  h4 l+ w; G3 l
void read_MSG_buffer(int *baseaddr)
9 b5 P# X% ^8 x$ V  C{
' C$ H4 u' V9 d1 _! q        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 N2 M, Q5 y. T$ c
: h- s8 B5 z/ y! {+ I: r7 r: j        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 O3 L+ J# X6 r1 t/ H1 f2 t+ F/ r4 G) l$ Z* b/ i- P; H! G+ ^9 e
        if(pshreRAM->packet_cout != count_copy)& I- w* q: F/ T4 ~, t1 p
        {
' A8 o! h; d. c$ \9 \                printf("a is %d\n", pshreRAM->a);! K+ ]* ]# C  H! I* q& t9 e/ b- X
                printf("b is %d\n", pshreRAM->b);1 |/ J* A1 W# _; V0 v; v3 x
                printf("count is %d\n", pshreRAM->packet_cout);  |, ?6 S+ n; Q& O& H
                count_copy = pshreRAM->packet_cout;$ i- B1 Y/ W$ H2 N$ S- t
        }0 v0 C% }' S: q. {* E
        else
3 }8 Z8 _1 k3 I# j' ~        {0 W4 f- s) K. C9 q/ u0 }
                printf("No effective message!\n");
, B- D" a& J2 s( `$ @3 s        }: p2 K. q2 c) X* \8 h) t0 Z3 v/ c
}2 n+ P  b. L) B( V- e+ T! v8 u0 ?! k
" P, x$ L2 Q& S; |2 `4 T2 `
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! @- N' m3 ^, D4 o
( H' j+ l* W" J. O& V" ^$ d' T; n7 [
, [4 h( @. K3 W( Q' h# Y

3 l4 [% B7 B* r; P% y! {! Q




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