嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 \) h* T% ?/ W  x

0 K3 m3 U3 }$ \( r) O: B% i, wOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. l8 X, D/ C9 E- t/ ]) F% x#include <unistd.h>
4 I6 V9 B/ e; a9 e9 m0 |" ^4 Y#include <sys/mman.h>
! q! M3 n7 Y- _/ F#include <sys/types.h>
% J: p5 j% g9 V5 j1 ?6 z9 H#include <fcntl.h>
" F; F6 r# W, }1 j# Z7 \$ b- S! A# T1 Q. R9 P( R
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ; X' T  r; t) x5 A: R0 \% k
: ?' v8 n( z1 D
typedef struct
/ K" O+ `! [& R) T* x; s3 U{
* W1 w. ]% V; f        unsigned int a;7 R- H* H7 P5 k" k: K. j
        unsigned int b;& R' s) U0 Q  R' d
        unsigned int packet_cout;" u/ J8 S& t/ ?( }  I  ^; ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* j' K7 ]2 Q, [* l- l, m

# }6 _% c3 m! m( dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 F+ {. g' b" p, N: X
unsigned int count_copy = 0;8 E1 ?) f( {5 t8 q

% X- t- n: k3 r; i1 }. e. K0 q' s* n, i7 f- X* K* D4 [
int main()
4 u& k9 E& E5 W7 d( U. b{8 G" g4 r1 A8 g& `! c
        pRX_MSG_PROTOCOL pshreRAM = NULL;* Z8 C. T% c5 K# V# W+ H' A1 C
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;6 Q( D9 g  i+ h: e
( `4 B% ~4 U! ~3 d6 W
        while(1); s1 N3 @' I, w( ?: o' u9 @$ w( J. [
        {
2 G5 `$ ~7 D, s7 i) a3 }                read_MSG_buffer(pshreRAM);
4 V* ^4 c% v9 f4 G& e( R! B        }               
' i$ x' e8 ?$ I  ]" g7 h}
2 N( u2 ~1 U2 z5 }5 N" P4 S. v* [. l4 T! }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM): X; S# Y  c' [" @6 f# }5 y& W
{
8 J8 I4 s: f! ~& T# D        RX_MSG_PROTOCOL buf;
  a/ k  i- H& E        
% j, q& ~3 Q- L        buf.a = pshreRAM->a;- U% w& W$ {! ^! M9 \3 A* b, ^
        buf.b = pshreRAM->b;
4 X/ h4 j) z/ @/ A        buf.packet_cout = pshreRAM->packet_cout;
8 v; P8 |0 D3 E        
/ W5 R/ ]8 Q/ [8 W        if(buf.packet_cout != count_copy)
# M0 Y/ ?- z, |9 O: S4 Q        {
' x- B# h4 G/ `                printf("a is %d\n", buf.a);
0 a2 |, H( _  b                printf("b is %d\n", buf.b);6 i/ |% K+ U/ _3 @3 c; ~" b; }
                printf("count is %d\n", buf.packet_cout);+ S) {9 t# h" A
                count_copy = buf.packet_cout;9 g, |5 i4 y9 A( N& M* `5 g7 j$ F
        }; }% l8 R  `( `4 B9 T% a9 q
        else( v' P% [# {; i+ f2 K+ |; g' m
        {
- B0 j# @2 n0 A2 l                printf("No effective message!");' d- t$ }3 D! e$ P
        }
! [0 N- n1 q4 f$ V% ~" Q}
( q4 P6 I/ E& C* ^9 S. v' S
$ C% v8 o! C) j+ r1 a
+ }) G) n" L7 ?6 J% P2 E但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。. h# M& `) V- e; e) a/ K  U( K0 {! v
使用下面代码,对内存使用了mmap函数后:
; z' y0 D# J, r+ _3 e# |+ O" C#include <stdio.h>
9 w+ }( M, s  t" S, ~#include <unistd.h>
) [9 h/ l/ H, D#include <sys/mman.h>
, f1 t( b/ K6 [% y6 ]#include <sys/types.h>
* N+ h8 f+ _: [#include <fcntl.h>4 Z  u. D, J# R: B6 C9 U: F6 \

( X& C% F% n. ~: P3 G! ~#define SHAER_RAM_BASE_ADDR    (0x80000000)
* ^6 |- ]5 c  E4 K, t' u* r#define SHAER_RAM_SIZE         (0x20000)   
  k+ z$ B0 z8 w% \+ Z" k4 j  L$ i; D: N+ V5 e
typedef struct4 X# ?' @) f$ f0 Z5 [
{
0 ^$ M& i& f* X( O, r! }        unsigned int a;- y8 U: _- I# b7 ^% z" n/ o
        unsigned int b;/ o1 C9 \! x- P# K" H3 H
        unsigned int packet_cout;
( ~; e+ ^0 d" n6 i2 |3 V1 A6 O5 @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 w, W; X3 I( d
# F9 i1 U3 j7 t4 i* ovoid read_MSG_buffer(int *baseaddr);
8 x9 l8 J- F1 H8 r. D' Junsigned int count_copy = 0;
7 s4 Z8 L# D  ^# `& \) R7 N+ M2 @, f4 n
int main()* U+ D4 ?  v* j7 Q+ L1 q; b
{
+ b# Q3 Q2 F. `% D# M        int fd;" [! o' R2 D# P6 }9 J7 Z" s
        int *mem = NULL;, R' R- {# S# \! d, g

3 T4 y0 Z7 s" K* {1 o        if((fd = open("/dev/mem", O_RDWR)) <0)
8 y6 ]4 s8 y8 U- r5 L# w        {
+ W  O5 q8 {2 \, \6 x1 ^2 N; k/ z. n                perror("open error");
  ~. K9 w9 y+ a1 O& T                return -1;
. o6 W' h( k7 X2 o6 G        }4 u& m- Z$ s: w/ E. I8 s$ X
        4 z4 y; T3 y$ y: m3 j
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 z0 }! ?$ y% ^! q& y0 s& N$ Z% `) M3 m) Q% m* L6 q) ~8 j
        while(1)
: x5 F: Y5 R( L: e! Q4 |0 a        {$ }, k5 Y  W. x; p3 b
                read_MSG_buffer(mem);
+ b. \+ f& m, \1 [) t        }                  P( I# Y6 n5 h7 d
}
8 C2 I* b) ~& ?0 ?! B" k2 u4 H  f5 v
void read_MSG_buffer(int *baseaddr)
' K6 c1 U2 b: P0 Q  |{
! ?$ o3 V' D" |0 m. M        pRX_MSG_PROTOCOL pshreRAM = NULL;7 ]3 N) C7 Z1 }5 W0 u' A4 @

9 O' n8 ]/ e" V2 L7 |* V        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; _2 y. e6 [0 A: R. W8 D

1 Z% a# a4 d3 H8 W: [        if(pshreRAM->packet_cout != count_copy)
: q. V; a( Z) o5 d        {
3 b) v8 d9 |2 ~5 N: k& W9 n                printf("a is %d\n", pshreRAM->a);/ L/ ~' b, D) ~0 q. s! J8 E
                printf("b is %d\n", pshreRAM->b);
/ w. }, l3 @1 R4 F/ s                printf("count is %d\n", pshreRAM->packet_cout);
/ @1 ?0 h3 c+ _' k                count_copy = pshreRAM->packet_cout;$ p1 m& X5 P/ R, g7 q+ ?% y, R
        }% u, P. W1 j# [0 {/ R
        else; h8 R# v& X; D
        {
: {# i( ~# K* G$ d                printf("No effective message!\n");
6 |( P0 n) L* U4 U" A. q9 p5 v        }
, @. Q! S& z) w: ]/ l* r( y}
3 c' A5 t# K( f* C# g7 D% b' r& v& r: g& l
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: @, Y) w) m( g4 T  X

9 b- V  V; q' j! Y; F1 h5 ^. F; X
- G4 D9 G7 d0 s% _, U; e
3 Y. \1 M5 x  b" p8 l4 U





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