嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! V* C! |) D3 b) {# e9 P
/ r$ _) X9 o4 h
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" Y' Z* N. P! M; ^$ Z* L. x4 r#include <unistd.h>
" f% Y4 e6 X6 |: ?( z+ }#include <sys/mman.h>
. c2 D# F' v1 n  _#include <sys/types.h>8 e9 S' A% f/ ^& I" k  N) T, I0 \$ k
#include <fcntl.h>/ ]/ d4 G1 y0 {# r6 z" H4 n. y
/ N* W4 g* ?) d9 T  H
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
, ~! d0 s( Y2 A; z1 N' P/ Y% P, {. {0 D( h% x5 {
typedef struct0 ^, w3 A; z) z4 K2 {
{( h" }6 P7 v3 U$ H4 g( n
        unsigned int a;% x- D% ?) c: q" o  X
        unsigned int b;
$ E. o& W8 g6 k' r        unsigned int packet_cout;8 F# V# g! z& r0 j2 }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% a0 P( n7 [  }. ?) K* y

" F' D3 A9 l, E: rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 u4 w1 v- i5 a; d2 f( n$ Y* Cunsigned int count_copy = 0;
; k; A) m0 p: N: R6 b, d5 `2 B: M/ l2 t$ f# @7 E

, [& V, _0 `$ {4 r# a* Rint main()/ t- y6 N; O+ [/ c  H
{( X/ A5 T  ~+ ^  g. |
        pRX_MSG_PROTOCOL pshreRAM = NULL;3 z2 @3 }, M6 v; j* {% g
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; g2 N( u0 ]2 y: h5 t; t9 L" T8 u
: ]. ?6 h' v7 S' y5 m6 E        while(1)7 {0 ?2 K' t5 E8 F; Q/ x
        {* ~$ a% h& [, T& I( i$ l/ q2 c& q9 {
                read_MSG_buffer(pshreRAM);
+ L4 k: f* D' K, l1 P* ?  L        }               
3 @. W9 s- `! |! \: Y}
, @' Y/ n& U; K! B
  a$ |! [4 I; avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" Y  F* {8 b* q- O" @9 q/ L# ^( S
{/ p* l7 W! T! ^2 M
        RX_MSG_PROTOCOL buf;
# f; Z- ]# r0 ?5 e" L        
4 E1 [% u* h; i, G1 P$ {        buf.a = pshreRAM->a;& T8 ~& @. e* Q! n3 [. t5 M
        buf.b = pshreRAM->b;
  e! _9 y4 M" |0 U5 d* w        buf.packet_cout = pshreRAM->packet_cout;
6 \* P& e( b: o, B/ d  O        
/ U$ ^; z- g, l9 ?9 z# [+ r        if(buf.packet_cout != count_copy)( B/ P. S6 f/ d2 r8 Y& Q% ^
        {
4 P: |# l7 G/ w9 X8 ^  T! K. N                printf("a is %d\n", buf.a);+ C/ K* F9 T# S. Q: c
                printf("b is %d\n", buf.b);
0 k5 z$ j+ \% w# t( r                printf("count is %d\n", buf.packet_cout);
; I8 L) w: S3 t                count_copy = buf.packet_cout;
6 @$ n$ q' e& f1 O. _& k) y" @2 ^# z5 b        }- q3 O  z8 _$ M, W
        else+ {7 b( R, g8 G5 c* m1 R7 l
        {
5 j0 X' o1 M+ ^/ S                printf("No effective message!");
  f" O( ~+ i" u; i+ |- W        }! o0 g+ X  _: j/ u1 n. b
}! K& R1 S% c+ r: C
" K# v% A  b9 H$ i9 A5 Z, x9 k9 a
6 z8 w) y( p6 C& Q5 A" f
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 I, n+ x6 \: z; ^6 |$ q' |
使用下面代码,对内存使用了mmap函数后:* |5 j9 q9 b8 Q5 Q; e- r  J
#include <stdio.h>
+ n$ L; H! G0 J1 ?, D#include <unistd.h>
7 V- S: x$ N4 |. N- O3 k* U#include <sys/mman.h>
5 j. M4 `' d" v8 f: j* x#include <sys/types.h>6 C$ o5 F: |4 ~' j
#include <fcntl.h>9 }: P4 |8 ]3 C& [! M6 L" A
0 S: Z9 X# R) E6 ~5 G( O7 H+ x/ o
#define SHAER_RAM_BASE_ADDR    (0x80000000)  A0 u2 i% ?) f" r! K" T
#define SHAER_RAM_SIZE         (0x20000)   
- Q& }! X8 K0 r$ \& Y/ x
5 S: S- F7 ?4 E3 |8 u4 Ptypedef struct
! B% p  s7 R/ c2 N& R# I{
9 b8 f5 i% b$ e( m$ g2 v        unsigned int a;& c) w/ C- H% j
        unsigned int b;
2 j' e1 l' g+ i0 Y0 @6 a        unsigned int packet_cout;& H2 c+ {6 l3 N$ [* `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 z8 @3 M7 @% U3 d- O' D* j+ ~, }1 {4 J' K( {5 u1 y
void read_MSG_buffer(int *baseaddr);
4 y- g3 r) h! K9 w/ junsigned int count_copy = 0;
* ?9 r  b$ K& U, _- ]& P9 e  G' H: |( d5 e. V( \
int main()6 q; j& O  q$ ]6 g
{8 p, Z9 j6 L" g% U
        int fd;
- k( N$ I8 `6 K* a0 ~. ]        int *mem = NULL;, @2 ]& }2 H$ s7 v9 J, z. S' {9 V

, a4 ^9 ]* U% O- R( o        if((fd = open("/dev/mem", O_RDWR)) <0)/ M, c6 ?- M; U9 S; d) x
        {1 P2 w5 P3 B& Z, }$ f
                perror("open error");
! e! B0 u' b; X: J7 {5 n; R" m6 \                return -1;5 w5 |# j, |2 z- t
        }
2 ]9 k* p. K% L% \2 E* e        - U0 a5 ]2 h! R3 w% A; a
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 C7 x* C4 O5 B$ f# L
. f3 }7 G4 N! |- P9 a% z        while(1)- P0 w$ `3 \# y3 ~- E( o. s
        {
2 J( G. p( }7 V% c& X: l& A9 n                read_MSG_buffer(mem);
% C/ ?0 j1 i5 a/ K4 x0 G        }               
! |9 M# q% S( y& d6 w}7 R' z0 a, X& S
2 g3 t6 i- X5 P# ^5 l# d0 ~& g
void read_MSG_buffer(int *baseaddr)$ y/ V# Y9 R) n# E- ^& Z
{7 @' G3 c* c8 w2 G2 o" {9 ^
        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 N! F" a# I9 U& x
! a2 o9 n3 q8 T# x        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" ]) Z: g8 y( e* @
0 r! T2 M, n4 Q$ p6 @
        if(pshreRAM->packet_cout != count_copy)! b3 v, t2 r( t5 j% M+ ~* l/ L2 X
        {
6 A1 W  I8 ~. B                printf("a is %d\n", pshreRAM->a);
% h* @. `( }7 Q  C) b: @                printf("b is %d\n", pshreRAM->b);
6 K# n& m5 A, A# [                printf("count is %d\n", pshreRAM->packet_cout);9 h' l/ }+ s6 I# ^( X) V8 S
                count_copy = pshreRAM->packet_cout;6 A3 `. [- ~& M2 E
        }# A. E# f' K& `/ m  o) `
        else+ p- z" C- k9 F9 G
        {
) v# i4 Q9 O9 T5 o$ H2 F                printf("No effective message!\n");
, D. R% \+ Q9 A& w6 v0 |( b        }  {) y$ b) I8 i$ y% X4 W
}
( h2 t4 _) d& v9 c! O( g
/ Q% N2 T9 a. W4 q没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; B" ~& Y  s3 ^5 Q
. g( |5 T+ t5 V* A# I
, F2 K7 Y0 Z; M' V! Y* n4 ]5 J& r' D1 v( [3 c+ d$ ]* R+ H
% u  Y& ^; W* T1 U' g





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