嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' j  ^+ K" y: c
3 Z3 Q3 n5 l9 R! ^0 A1 v1 \  T7 ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' h  b8 _; k( s3 |& H, O#include <unistd.h>
8 q( x* `5 V# y1 y4 y- T" `#include <sys/mman.h>
4 V/ e) J" s' N# O: S/ f* X  y& D#include <sys/types.h># h! f* K& w0 F5 Q2 _7 Q" e
#include <fcntl.h>, Q( V: U( a4 F  e$ T

! |# R' b/ X' k#define SHAER_RAM_BASE_ADDR    (0x80000000)   # `: h* r- v1 k0 L
5 x. F( U. o! c6 k" a
typedef struct- O9 G/ s" X* @* m2 Y
{
0 v; f% y8 o7 ]! S) d# N        unsigned int a;  X7 L3 I& t1 M' `: |- Q
        unsigned int b;
# T* B4 r) N1 m0 ^& k" h7 l        unsigned int packet_cout;
: t% ?& {) T; b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  ~% q8 R8 r8 i& s% u7 s

% \8 J9 p/ P/ [0 yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; V7 _( m9 C! ^, \1 v1 D" q
unsigned int count_copy = 0;
  u# Y' y* T4 Y+ F: Q% g: A6 p
/ p/ ?" I" d5 s: B& V, k( A, e( J/ b* a. Z
int main()
3 g! X/ Y, M. X" [! K( t{
, }: p: J8 Z! p& f- {9 l6 Q- g        pRX_MSG_PROTOCOL pshreRAM = NULL;& f* P. v- c" S' V
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; c: H( N; S: ?6 [# k

% t; r9 F! R/ [6 Q/ K' L. C7 c        while(1)) j( }, v, x4 I
        {
2 N' ^: \- ^5 `# ^                read_MSG_buffer(pshreRAM);
! P" z% e7 Y# g& H        }                ' ^) x/ }0 N& s' k6 ?9 @
}
; k# I1 b6 n3 k" q8 @/ M
2 I. G% w* J8 U3 l) c9 w' _3 f" I" xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( M9 }! q+ L, p; D{2 g/ d9 u9 `* ?, D
        RX_MSG_PROTOCOL buf;
2 r# y3 X: G" p) n        7 U0 z3 p. x7 K+ F
        buf.a = pshreRAM->a;
" [, g2 ]) Z" O; l        buf.b = pshreRAM->b;
6 J9 M/ v% e7 Q        buf.packet_cout = pshreRAM->packet_cout;" g5 {5 C( n* H0 b
        * |5 t4 a# \4 f8 c" y
        if(buf.packet_cout != count_copy)& {* ?) }# i# G9 H, T. i: ]
        {8 W2 c5 Z$ T/ y2 ~. I
                printf("a is %d\n", buf.a);% u- H' ]9 F4 t
                printf("b is %d\n", buf.b);3 M( V7 f% s  Y* p- d: N
                printf("count is %d\n", buf.packet_cout);
0 q. C. q: `5 K6 h                count_copy = buf.packet_cout;
8 p8 R3 o+ e! K8 n' ^/ @        }
5 R! |0 l: h) ]* C! d3 z% N0 J        else
8 U+ F2 a7 W# A: ?/ X7 S2 q        {
) l" B' o# _" S3 I# C4 S                printf("No effective message!");
5 B# q% E; N9 t9 Y        }
$ ?$ p7 o3 X! \9 O  ]}
8 e, w2 `  F9 G3 a2 X
7 X% u. M$ I: {; R# k' i- F
$ {6 F- D+ M3 a但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* I. m/ u1 Y1 Z( V; T& `: T9 M使用下面代码,对内存使用了mmap函数后:
  p) o3 u% |4 p#include <stdio.h>' ~! _0 X$ l3 C0 T! q
#include <unistd.h>
) |) `6 Z/ N! o9 S6 ~# I2 N#include <sys/mman.h>
- y# i, Q( X( Q, S" H0 w#include <sys/types.h>; s$ X8 ?/ h; |( `+ q& O
#include <fcntl.h>
, |! z2 i6 H$ o1 Y6 O/ S4 Y/ ~" w1 M7 A4 ?; e. }7 s# e
#define SHAER_RAM_BASE_ADDR    (0x80000000)# g6 i8 I8 _4 b9 }; L0 z, B  y
#define SHAER_RAM_SIZE         (0x20000)   + ~* P; K1 Q& b- [( H3 i% J

( _8 \1 \8 I+ u8 {! Ctypedef struct. b4 c. i# x9 N; Q, E9 F$ p
{
- |3 q& J/ T( S6 ?! ^        unsigned int a;; V  _& I$ `! i$ L9 ]' G4 ^$ O4 o
        unsigned int b;6 Q. ~$ z+ B! e2 I9 C
        unsigned int packet_cout;& L; b" ~# D/ c/ r0 G# v) d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 o% B1 g! M& S' p: }) \8 D
/ d. m# n# j4 g' T
void read_MSG_buffer(int *baseaddr);
1 U; @" Z) w! Z& h- c( cunsigned int count_copy = 0;
" [- t. r9 {  Z4 @
" T, I# B" Y$ ^/ q$ H: Eint main()
+ i, l6 c6 y& O* Z4 d$ ?! v{3 j, E1 L2 `# w4 H/ e
        int fd;  v/ o% W; I/ h! M+ }" W9 D5 K
        int *mem = NULL;( v+ k0 Z: E+ ]5 N" x1 r
' |' H- S: Q: R0 F
        if((fd = open("/dev/mem", O_RDWR)) <0)5 R; T/ {+ j$ {
        {
: x% L+ D; Z2 _$ Q& ^7 K                perror("open error");
: `7 l$ l9 e# A4 Y) w                return -1;
7 e9 h4 r. H4 _/ y3 I" w        }
; D2 J$ ]' ~. Y4 M2 `1 ?        ( ~' D. j. w. a% B
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 i( S! M6 _, P; o7 L& r/ U8 Y) u2 L' P" g4 `
        while(1)
# L( a* C1 E; f$ \        {# U0 B* I0 j9 b& B0 ~: c4 \% F' ~6 Z
                read_MSG_buffer(mem);: t1 g" j& \" ]
        }                & \$ W9 ^: v- p6 p! N% h# \
}7 c6 r2 h' n5 a& A, S
( A: g( G" C3 c$ b1 b
void read_MSG_buffer(int *baseaddr)
+ {7 K- B, i$ m7 O5 d7 K$ ]{
% H8 ^, z% m: `- j- ]6 V        pRX_MSG_PROTOCOL pshreRAM = NULL;
& `7 ~6 q6 q6 k/ s6 K$ Z
( @: [5 m# I# e0 y- m9 ?        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 e" o6 l8 e% Z' Q

! V8 s1 I% ]+ H1 F. H+ J        if(pshreRAM->packet_cout != count_copy)
5 c$ [4 h% Q3 ^' G        {
; t! e: t$ J+ [$ h6 D" T# a0 }6 \% O                printf("a is %d\n", pshreRAM->a);
9 d: p& I: a* ^+ M5 B. p  _- u                printf("b is %d\n", pshreRAM->b);1 a# L4 O3 g/ j+ N# V1 W. A* N
                printf("count is %d\n", pshreRAM->packet_cout);
+ k1 N# f6 L! n, J* x' O; z                count_copy = pshreRAM->packet_cout;2 d& p( o' g, M4 w0 f! ~1 N3 D
        }2 ]8 n  @1 C$ E8 A% S  c
        else
) h5 o6 O$ {" V5 F        {
* r7 ~6 ]! u) d3 L1 B                printf("No effective message!\n");
5 L: A, w* p3 i+ @        }
8 E# B8 }0 x$ k$ n}
0 w+ N3 f* |5 x  a9 D/ L
7 r0 s0 @  v9 j% U! v" l  R2 {没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( q& N' i9 K" h3 N( u
& }% \& j% F* Z8 C' I

0 P# `/ x3 w2 A$ J
* p2 R1 y( z8 S! M( a: n2 |" n. U: c4 V. \9 }





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