嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " r2 f5 d" F$ V1 R6 u
+ U1 [* Y" O  C7 U; }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ g8 ^! a+ m! Y# R/ V#include <unistd.h># u; M& v9 G3 B+ k! j) i9 ?0 q+ {- j
#include <sys/mman.h>! U+ b# b4 p6 I5 Q! T* M
#include <sys/types.h>( `6 g  U# u' i& C2 E! u5 r
#include <fcntl.h>
! b, m0 w# @6 g+ d/ g  L: F
7 Y/ v: N% X% b#define SHAER_RAM_BASE_ADDR    (0x80000000)   ( A6 u& p  _5 J# ^% O7 M9 c

/ U( B: I& d3 D7 ^, @% ^& ntypedef struct! H2 `  Q0 Y+ T4 F& C& _; e9 E
{2 `) [; L0 ], |$ ~+ `- k( N
        unsigned int a;
$ p( ]! J3 U" _: w        unsigned int b;+ K. B/ D7 ?( _# B
        unsigned int packet_cout;  G' @& f9 c' k- z: h4 g! Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 h5 ]1 K+ s  H7 w; c& J3 h# e# X( G% Q9 N. h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);0 h& \. b" x" v) P  p0 [
unsigned int count_copy = 0;
% a: F1 T6 d4 x9 J
8 J: E+ b% |2 J! W5 D8 A. R9 K
  T- d  J) {# a8 K% j% X$ s/ Wint main()7 D6 }  y7 q) [9 g
{
2 R6 G8 ~$ K% W8 `# L, ?% [        pRX_MSG_PROTOCOL pshreRAM = NULL;. ]" C+ d( y+ }* X  s6 c2 @, u
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 o' J' Y3 S; \& Z2 t6 c& H4 R7 c7 H0 C0 t& E
        while(1)
& I# g& h" t( t" P  H% t        {! w, P1 r, I; x5 t, {2 \
                read_MSG_buffer(pshreRAM);
! h4 ~) h' M& k        }                . o+ D$ v  W6 }2 J
}
, H. w* M4 A! U' Y0 U! ~5 `$ V) E& R0 n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ a% Z! i+ M4 o6 {# h{
$ N6 @( \. d$ z        RX_MSG_PROTOCOL buf;
5 M' q7 P/ {8 X5 U6 L/ ]; y        
1 D# I( b8 Y$ S8 v" X% |        buf.a = pshreRAM->a;5 r% i2 `6 T$ |% M* I( {
        buf.b = pshreRAM->b;
; P, d! ^1 Q+ N1 b, B6 N  v0 L6 x        buf.packet_cout = pshreRAM->packet_cout;+ `7 r, l) W0 F" [3 }9 m  [4 Q1 }
        0 s) y: ~' ~  f: X: P1 V
        if(buf.packet_cout != count_copy)& }: d7 d& _: n0 I& l5 }
        {; `1 l2 T8 G4 A' k& B) l7 c+ R
                printf("a is %d\n", buf.a);" f$ B) [$ Q, v# k
                printf("b is %d\n", buf.b);' N7 P& j7 }' H  @  V5 q; O* }
                printf("count is %d\n", buf.packet_cout);7 j$ o5 [  z& Q) E8 v; Q
                count_copy = buf.packet_cout;2 i! N6 ?" Z" P2 E+ u
        }
, ]5 M. @/ R- |( K% ^. ~        else9 B, W/ M: h8 |- M+ ?: w9 b3 B* ]
        {9 F; z( _: A  \* ^3 G( a
                printf("No effective message!");: M. X* A8 i& R' F) }
        }
. l7 Y9 `- P4 k8 [: Z  j}5 v2 H' c9 v+ k9 c! r* P" W; x" I

1 j" f& @! ~0 g' l/ V
' m* g" y$ m# k* T& ?- {: F* X但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. M- g' b# R8 \1 |使用下面代码,对内存使用了mmap函数后:: H, M: v" \- O) I& Z
#include <stdio.h>
' ~2 l4 H6 o9 G#include <unistd.h>9 r9 p: K) N+ A2 u
#include <sys/mman.h>* [+ `8 M* b* u7 C( @
#include <sys/types.h>
3 H4 M- p6 t$ Z9 r#include <fcntl.h>' e$ W# W" j, R) z% U" s
; X5 S3 U) h5 s# r
#define SHAER_RAM_BASE_ADDR    (0x80000000)
: ^0 z; E" w; ?- S/ b#define SHAER_RAM_SIZE         (0x20000)   
# J* Q. ^! Y. P
0 ^( d0 R3 L: c+ W# E) R! {typedef struct. h) \# [& g4 r
{
9 D5 Q# w  t; D+ w. C4 E        unsigned int a;
9 S; J. G7 C: Y; E! Y1 E$ K        unsigned int b;0 `0 c# R8 n3 H$ W
        unsigned int packet_cout;
/ V3 k! m; r) {& b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 T# v0 S- o3 l7 l! T' i& M# _9 M6 t0 N3 i: p9 t
void read_MSG_buffer(int *baseaddr);; n- V7 I( D2 Q" k
unsigned int count_copy = 0;3 [& l( t- @" z3 M0 {( X: f2 `3 p
2 Y7 Y, M6 c  I' q2 i2 [
int main(): b' A2 O8 O1 x3 I
{
. p* [) p) T( Z7 x" c3 U. N: X: ?        int fd;/ e; j7 o! m7 b7 ~- G
        int *mem = NULL;. g" z/ v% X6 s7 a

: Y4 F0 b/ F5 G: t        if((fd = open("/dev/mem", O_RDWR)) <0)
3 {2 w4 M5 T% d& y$ F        {' |. h( J" A/ Q. ^0 P
                perror("open error");; O) E" s- ~7 N- b
                return -1;
, X% Q1 i7 O( z" c! f        }
. c  V9 E) k5 M% S& Y        * U7 L+ m3 I& z6 X  @0 E* r
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 `3 E/ W! `9 l% |! Y7 y# B
' ^+ Q, I( k: r2 ~7 V3 H" D' ~) [
        while(1)4 s: w9 H3 h( k. a9 E2 k
        {9 d6 n, i  ]& Y/ l2 B
                read_MSG_buffer(mem);
3 I* F9 J  v, J        }               
  j2 ?& B) O% s+ K/ x  S& j; `: H}
6 f5 J! C8 {$ e$ e; J$ c8 Q0 }" p$ r3 F
void read_MSG_buffer(int *baseaddr). S9 Z; t" B7 k5 g- _) }* H% `
{3 q4 S" v: n, U( g& R7 d) n! d
        pRX_MSG_PROTOCOL pshreRAM = NULL;6 B, }1 X& K, [0 \

* C/ d4 D4 M8 A- D8 `        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 k) P6 x$ A$ b' n& ~5 B& l5 H0 C

, |% U# L" a0 J7 v8 ?9 n) N        if(pshreRAM->packet_cout != count_copy)- X; `$ O7 C" M! i
        {
1 P5 k1 q" U5 w: Y) y2 e$ C                printf("a is %d\n", pshreRAM->a);
4 e5 ]7 [; {+ [3 L8 i6 x                printf("b is %d\n", pshreRAM->b);
) Q8 |, e+ O* ?" h4 Y" H  b                printf("count is %d\n", pshreRAM->packet_cout);* a1 e8 ]* \+ o) b
                count_copy = pshreRAM->packet_cout;% `9 o- n" q) \! B( e
        }
  y9 m( {. ?" p; U/ u, |        else
1 L0 s' x6 C, N+ s4 ]  I- Z8 I        {
, `) w/ A5 }, s                printf("No effective message!\n");& Q+ T; }1 \5 C
        }7 j+ @7 R6 I0 Y/ O! h1 j
}
. q) X" F1 R: B. S. q
$ Q9 @6 }- k$ B( W, Y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" Q5 q/ |1 b# o) I& b4 n; P8 P1 I6 E& H( x! P: y6 V2 E

- S: I: \0 E, k( s  Y( Y; Y# }0 c/ Z1 @8 j) H% G
9 g$ J8 w4 C, c( }: u





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