嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) K" b: X  J7 t7 I
2 }( q* \6 _2 |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 x( E5 M' Y& Q& g2 r" r#include <unistd.h>
7 Y( S* o" E6 N4 h" J6 K: N#include <sys/mman.h>  Z8 M1 o6 O5 B" E" v% p
#include <sys/types.h>* g( Q% a4 y+ ^+ _% e8 X
#include <fcntl.h>
7 E  P/ @4 M* ]0 N8 l$ s) j. K/ f2 ~
#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 o6 Y' e) |9 F
1 U. p+ d4 _0 t( P7 ~
typedef struct
8 J. O5 [& ~% ?" O{2 X( ?; ~* }1 l; H
        unsigned int a;! `) q5 c3 N7 V% F- S0 I' Z) e$ u- ]
        unsigned int b;# @  o( e( E4 O9 X9 f
        unsigned int packet_cout;
# u% }$ d$ B) T& |: P1 }4 T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" w( Y' k* l9 y) J! ]
. V7 \2 C# b5 U& b7 F/ _2 s  I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ r8 j6 [# }3 u  w8 F# R4 ?unsigned int count_copy = 0;
$ _/ B; b6 x) f* C% `; Y' a+ ~6 t$ V; O1 F

. |+ N9 J$ K- C. g2 A2 fint main()
/ u$ y  Y1 T* D4 U+ w+ g  u  K{
- m1 M9 W- n7 |2 m        pRX_MSG_PROTOCOL pshreRAM = NULL;4 Z, u+ t2 Y% t/ p3 N! P& ^7 P9 `. ?
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 w9 K0 T6 v3 |: x0 L6 t
$ `0 Z- L: c, j        while(1)
& L3 O( D9 g( @* x8 R2 }. q# D        {
5 g1 M2 F& P# v) E7 ?5 F                read_MSG_buffer(pshreRAM);
9 @# w: o# G9 q* I* M        }               
% |+ `8 H- y' V) @3 x}$ o  ]2 x+ {- }8 q7 b3 C
2 |% T8 ~) ?& e5 ~6 n+ Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ j! X- e  p" Z2 V" y9 ^0 f% e
{
7 ?# k, Y: L' E4 L. }7 T, h; q        RX_MSG_PROTOCOL buf;$ U& g' ~, _* O" F) I
        ; q, U1 y- k8 ~! ]
        buf.a = pshreRAM->a;% M4 h/ W& N; E$ b
        buf.b = pshreRAM->b;: N4 d. Z: X. }, K" f
        buf.packet_cout = pshreRAM->packet_cout;* f9 ?3 _3 }" W' \1 M( G6 h
        
1 E+ W3 u! I0 w  j        if(buf.packet_cout != count_copy)9 d  |( ?" g) {  h
        {4 [# n( p3 q3 z3 a
                printf("a is %d\n", buf.a);
1 J3 ?9 n: e' Q* I" V0 T! r                printf("b is %d\n", buf.b);) L4 b- ]1 j5 e5 V6 j9 c# n: L' \1 J
                printf("count is %d\n", buf.packet_cout);
4 r& C4 s# W4 D) X2 Y* I# l                count_copy = buf.packet_cout;
) e' Y' j8 A' w- v# w6 N0 }        }
8 Z! _$ t# l$ k8 j+ r: b0 B        else* ]( R8 w6 m( c4 U& d! i* r
        {, O+ {; v, ^$ L" A3 O) }0 D% U- S7 o
                printf("No effective message!");+ j& g$ j7 V1 j$ [
        }
0 O4 ?# P, |" s  `}
, m6 J" x: d/ w+ H+ `. b
6 d7 a+ {$ u' o( i+ X4 ^1 J2 k( f2 X# R, e7 E
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 P- b# m0 y$ _9 w# ]
使用下面代码,对内存使用了mmap函数后:& K; L5 }" \2 ~* Z# U/ ?
#include <stdio.h>2 {* U7 p  q/ `' v) |- E6 {0 @2 F
#include <unistd.h>  Q. H! c  T* }! _3 ~1 ^8 F
#include <sys/mman.h>: D  d6 K0 {3 |4 _- I3 w2 x
#include <sys/types.h>
1 G, r9 R  a( [8 h& a# L#include <fcntl.h>- B( U6 w( v5 B7 i
2 o$ ~/ D$ o1 w( _
#define SHAER_RAM_BASE_ADDR    (0x80000000)8 _$ R8 i9 m7 B. A( g4 |. L% J
#define SHAER_RAM_SIZE         (0x20000)   6 q1 T; p: T7 G/ H) u8 j  [

" Q$ {. m) {7 c% C9 p5 jtypedef struct1 X! C. w4 j9 G3 ?8 N( M
{
/ T0 z  ~3 T4 N2 Y' r" J/ h) q        unsigned int a;4 l7 N+ _( A/ e$ F2 Z
        unsigned int b;! X" n/ G1 K5 f, `) V8 E2 l' `
        unsigned int packet_cout;
3 }3 I6 Z- E  K}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ s0 t2 ]1 z! l6 X- Y. x& t" d4 Z. {$ @
void read_MSG_buffer(int *baseaddr);$ z4 U, Q! O: b/ W" @
unsigned int count_copy = 0;1 K, w5 P6 U0 Y; Q! v
: H5 h: r" y3 k  Q+ _
int main()
8 H. c6 r, `0 T5 {! f{2 a- J# c9 e$ Z) h& e: ~# x" U9 ?5 S
        int fd;
) J  O- n5 P% r, d: q' [# ~5 b8 S        int *mem = NULL;  j( I/ p' o% @* _
( Z: j, b9 C$ q' G" s) j! u
        if((fd = open("/dev/mem", O_RDWR)) <0)
3 ]' W4 p0 s, ]8 {, V) z        {
0 W* {8 V5 a7 r' B9 H4 q- A                perror("open error");; U  B% t( {$ U; A# L9 C) F) x
                return -1;* G% J$ _  W# A
        }) R; P- _# x: }4 A
        
: h" n* c; s, x$ j8 [        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% M; p, e, s& c) ?. g) c
; m/ {0 K0 C* l& {. y& m        while(1)2 ]% B9 s% o: j3 G- A
        {
/ Y1 d# d* Q; ^8 z; ~* y# F1 M; D                read_MSG_buffer(mem);) T. s; s4 e; D5 t& w
        }               
1 J8 S" A& l' p0 C# `3 _}) }6 A3 f# `  l) S1 N9 x. |5 Q
4 h8 e  t/ H5 m7 S* z$ O2 \/ x4 H
void read_MSG_buffer(int *baseaddr)
: X/ v5 g4 O- v1 W8 t{% _% r5 r5 z8 @/ b+ M
        pRX_MSG_PROTOCOL pshreRAM = NULL;; q+ t) v& m: K- p2 i  c% D' k

1 h2 A4 N. r- J& s: k& d' N        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; B# [) J, j9 X/ h
$ c% b' a. Y1 |        if(pshreRAM->packet_cout != count_copy)
/ L- u6 v$ h4 N3 T        {0 \  I0 e; d. |5 V% L
                printf("a is %d\n", pshreRAM->a);/ q* l/ G/ z7 }4 z1 a7 b9 ^
                printf("b is %d\n", pshreRAM->b);
9 O: I9 H. H. _( z: V                printf("count is %d\n", pshreRAM->packet_cout);
9 k# Y, Q) a4 h+ z' [0 A                count_copy = pshreRAM->packet_cout;
  x9 ?/ B+ F: c' Q        }
& J; ^/ c, z, V" \( G# t7 ~        else
. B3 @, P- a6 J1 f        {
0 c- @$ Y' n9 k# \3 t/ a                printf("No effective message!\n");
2 G  X8 Q; B" f, W        }2 F$ ~/ @  p6 M" n+ h, b+ k
}" B+ T5 x( m" ~( B" Q6 u. a3 q( C

0 I; g; |3 w% o5 V  z, C; I没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???8 e/ n$ n7 C7 J2 q
9 j8 x' _" u5 H7 p2 Y6 j0 E
, U! x, p4 D7 w4 S* {4 d& ]+ [9 f- R
& ~% w( T2 B1 G# R0 E: N
+ v- l4 i9 B  i, r: K* y





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