嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; R% M6 h  {/ Y7 r5 W2 E) Z' @) F0 x5 p( b: _9 K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( l: n3 L  `! H7 t% r#include <unistd.h>' ]4 H3 l3 t' u3 x; f, C
#include <sys/mman.h>
  M( i% \8 E7 b! \( ~#include <sys/types.h>/ a- M: R9 p+ \3 t2 Q3 i
#include <fcntl.h>. W5 U- j6 F- ?4 g0 g" p9 K$ a7 [2 B
, N* e3 e" ~# z; b. M
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
0 ~. Z/ W0 Y" g& t& x
( ^4 J$ M6 ~: m# [* o2 [typedef struct1 B! `% F: a* k4 N" h1 F
{
- |4 v. ^( i8 F: X% a        unsigned int a;  x: h0 n/ P" z4 q9 o
        unsigned int b;
. d* M1 L* }% j  j; J        unsigned int packet_cout;  ?: Z. b( f5 z7 W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! p& H( a( S9 `& _$ u2 t8 R1 w/ x" u+ @) x# C4 g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. X' f% J4 U/ P/ L' \unsigned int count_copy = 0;9 I' _6 r; R/ Z  x
- z/ Y% F/ k6 `& f7 U
- f' J3 N% H3 S0 J5 M9 Z3 U
int main()2 d1 Q  z( a+ P, |# M3 q1 {
{. ]+ d! }3 S1 C# ]. H% z) ]8 W
        pRX_MSG_PROTOCOL pshreRAM = NULL;" N# D. h$ ]9 {$ V; I3 |  D
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ J8 O# d: C; u* o, Q, R9 }% [7 e% v0 G
        while(1)& L; f$ t9 ?! X/ s+ D
        {
4 z& Z# Z2 U0 U2 u                read_MSG_buffer(pshreRAM);
! R+ T: v7 _8 X! S( @        }                + ?0 H5 A8 [7 H* f0 H
}6 V" K, I+ b5 w. v+ n
" _( m  |/ t+ a- Z5 W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) p: p4 P7 R% j- V5 Z
{
. l0 x4 Q1 r  a/ o; e        RX_MSG_PROTOCOL buf;
( o! M8 p7 p2 R0 s& `5 Q; o        1 L- x& z, _* t
        buf.a = pshreRAM->a;: t! ?% a% _4 b: n0 Z. B5 _) @' u
        buf.b = pshreRAM->b;
. w+ R( ~: G4 m" l) y. s  G        buf.packet_cout = pshreRAM->packet_cout;# p4 _* I; d- `' i: w
        
0 z; I3 K; r1 I! k        if(buf.packet_cout != count_copy)
" l  t* E# y- X7 w, y        {! a# t- W* A5 g
                printf("a is %d\n", buf.a);+ P' V) S9 W) |- N; B1 J2 |( ~
                printf("b is %d\n", buf.b);3 |4 X  N, J) d/ [3 E
                printf("count is %d\n", buf.packet_cout);
8 J' i6 x) I( r. O' s                count_copy = buf.packet_cout;# c3 }7 i5 r- A' z+ ^# M6 d
        }
2 d# B& ?! u- ~5 C        else9 ^: W: x% h( d! r3 J. M
        {
) q1 N$ ^( n! }# _                printf("No effective message!");
# k) N- b7 C# }9 N# w9 \! a1 z/ D        }) w! t7 q% g" s% D* W  K9 a6 A" ^
}
* K' @0 b! K6 \2 @' _8 B8 q7 p
9 q+ |* s) a# X/ w( s4 @; Q
' P8 z) x4 ^( a. k4 K5 M( l但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 _1 y6 C- `  a4 F) _1 M使用下面代码,对内存使用了mmap函数后:
% A3 K" M. @2 P1 i#include <stdio.h>& S$ Q' z3 S$ K7 o
#include <unistd.h>$ k/ R+ C. q5 m% d: H3 D
#include <sys/mman.h>  U4 ]9 o' M9 S  [  H. N+ G
#include <sys/types.h>
+ E! B/ G1 T9 B#include <fcntl.h>
2 B# h: q& G. b9 D7 E  Q. t- j/ u; q* I; J$ x0 U
#define SHAER_RAM_BASE_ADDR    (0x80000000)- A  X& I0 r- y1 Y  [" ^/ ~+ p
#define SHAER_RAM_SIZE         (0x20000)   . f( h  @7 l  c/ K( M/ Q

% f# z5 p. c( i2 I, r0 _typedef struct  q( z5 b. k8 N; Q) h
{
* L5 v+ n9 y0 Q( z& q3 }0 g. e        unsigned int a;! ^/ e: I- `& K* o" H# E+ T
        unsigned int b;* F/ x2 e* n) S! h. r/ @) ^
        unsigned int packet_cout;
2 A7 u7 P# n, B! Y: p5 ]9 l0 m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 N) n- r0 K9 P0 V* e
$ `* A7 {7 T: r$ g7 ]
void read_MSG_buffer(int *baseaddr);/ [7 N  G* e# X
unsigned int count_copy = 0;( y  V0 s: Z. I# L$ C# {. m
9 b) Z! m) x. V4 G9 ~, L1 E  R
int main()
$ J- U, f+ h' m! Y0 [# g$ y) M1 Q{( Y8 l( @7 T6 z$ D' n! |
        int fd;/ @, K& @8 `- Y/ h+ ]* e6 z
        int *mem = NULL;
  o% [; v: [" G+ M" m) E& l
/ O+ k% a  h: J4 ]        if((fd = open("/dev/mem", O_RDWR)) <0)
8 l* y6 t) u% g  m. X        {
: q7 j6 _9 o  Q* x; F. d  p" r                perror("open error");
# a: w% L5 \6 [% E2 T' z4 V                return -1;
8 L3 E$ ]1 p1 e4 E0 o% h5 H! c        }
, a3 ~3 o' {& [+ M) m$ [' c        0 n7 @) h7 S0 P
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 ^3 v" |. M" L/ n
! f2 R, Q/ N% t8 V6 z- z" W( J
        while(1)  s, s9 |0 y0 R: T7 c- v7 u% K1 t9 w
        {
" _3 u' L) h0 \" Y) i3 i                read_MSG_buffer(mem);  \; w, j$ d- d
        }               
; ?  @( U4 p0 R+ s}
) I3 x0 N5 {# {* |1 C" _: t/ @$ `# v4 _  K! p. P
void read_MSG_buffer(int *baseaddr)
  O& I" A5 F6 O2 E2 |5 g{/ A" U; ?) w* G0 o, i0 e! D$ t2 [
        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 ^, [" h! }- c4 s
2 {& q+ o+ M# ~  T        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;( Q8 i% n! @/ q! q) N
7 C8 S8 V5 k6 q0 u0 n7 w
        if(pshreRAM->packet_cout != count_copy)
; Z+ a5 W4 y5 o        {/ k2 V! B' S8 k1 \
                printf("a is %d\n", pshreRAM->a);
3 P8 B, C: j$ a                printf("b is %d\n", pshreRAM->b);
) E1 q  w" `! }. j                printf("count is %d\n", pshreRAM->packet_cout);
/ ]* _8 v/ |3 [6 F                count_copy = pshreRAM->packet_cout;
0 Y: k# ]9 ^6 ]  C& f) G        }- \7 G/ a2 J: ~# e- C3 r, S6 c
        else9 _5 T* j# H3 g3 O: q" G
        {6 T( |$ a+ v' t. [
                printf("No effective message!\n");
0 Y, n# ]9 O7 f        }# f% `3 l6 y! R6 c, ?" |/ R
}2 ]4 b: ]* Z& e7 H) R

0 n$ K0 ?* S# X4 f没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: T8 ^. B  Y( B+ L- n% ]& v6 ~$ [
1 `; v. v% ]  E' V! }
* }% c& u) Z! t/ y9 z# H5 e& j5 z8 X

; ^% c0 o- i# f+ u4 |. ^




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