嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ; @( K/ r' q$ h' E9 y* U6 g9 A
* [  @3 }, ], z0 Z: A
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 A% K" B) b: x#include <unistd.h>6 Z6 G1 H9 t5 X5 [' Q
#include <sys/mman.h>
% t4 Y( L9 n0 s#include <sys/types.h>
0 v2 K* ]. |: I# T: V/ v#include <fcntl.h>1 l* `4 G8 _, g* S. p2 [0 u* @
# `$ X& l3 C1 J; r$ `. I
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
( Y/ A! a2 |' g7 A% g9 L0 f  _  n$ q( f- J. Q
typedef struct
2 j) s- Z* b1 i& l3 z; S{
; T, m! S6 B8 f/ o* r* f/ C0 Z8 J        unsigned int a;
4 K, `- B' k' ]  z1 v( c6 \  K0 _7 K        unsigned int b;
/ d% `" x8 W, h6 A7 c        unsigned int packet_cout;
0 O( ?. F% y3 b9 u7 T$ g4 z1 ~3 v! f2 Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 q( @. U; x: S' c) f% `
! N" s& n* i, q" I6 m5 j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 ]. x0 o6 u0 M6 junsigned int count_copy = 0;
- w9 o3 E; o6 f& T- T4 p5 P6 f3 p' \, }( G, S6 K9 ~

4 x+ c  K; v, B$ O8 _# o5 Q# Kint main()7 p2 S* e3 t/ ^: X: b+ S
{
8 }! }2 N$ ~6 ~3 b% `4 c. x0 [        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 A5 S7 N) P2 I* W        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 Z0 R2 Q; }1 y( ~( ]) X2 U5 b" ^+ f& {+ A; D
        while(1)3 t! u" w( c. c6 W  s3 P
        {
8 K8 d4 {, n7 q7 v- R6 |                read_MSG_buffer(pshreRAM);! V5 _3 A  p6 [. l2 m& M8 o: k
        }                ( U. d5 ~; w/ n$ a2 V& c5 c9 m
}1 W2 ?5 V; W) \: K7 z% V
( Q3 ^1 E; w' i# ^5 V' U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( {* S( ^4 Q. S  v+ ~
{% F1 r  y5 I7 [0 ~) _- y6 X
        RX_MSG_PROTOCOL buf;% }) H$ S# s# A( ^5 ?1 ~. _+ D5 Y+ z
        3 i" \' K0 c2 D% @1 Q+ ]
        buf.a = pshreRAM->a;: }6 B* f# }- Y% C7 g. r4 j
        buf.b = pshreRAM->b;
2 A- o* h9 e9 r; t; ~, I/ z" \) W        buf.packet_cout = pshreRAM->packet_cout;
( f0 q1 W2 N) b, @) e: F0 h        
$ a: \, {  y% {. v; G5 N7 s        if(buf.packet_cout != count_copy)
7 ]" O3 `, D% T        {; M9 f* \* k. }& Z2 s# [
                printf("a is %d\n", buf.a);
( t) [6 S, D/ F7 H                printf("b is %d\n", buf.b);
9 D, n( f' z$ {* P1 x/ e- o                printf("count is %d\n", buf.packet_cout);/ g3 l1 q4 c9 N* i) |
                count_copy = buf.packet_cout;
4 i# t6 R- W" d' e4 s9 ]        }
6 u# p/ v9 N7 ?8 Q5 ~4 z9 ]! W        else4 G% E) L7 B7 Y, j0 _1 c
        {
. V) F! l# @. a                printf("No effective message!");) k; g' H( {3 N9 T- t
        }9 J+ g, \2 [' A" b6 Z/ s& Y- e
}
/ Z0 ?1 G  D/ t! {* b$ a8 L- D# X
* v: r3 D- U/ `1 |, J2 d3 a; J$ d- }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- i6 @- ^2 v% g' W2 U* s使用下面代码,对内存使用了mmap函数后:
+ [, s( M* C( e#include <stdio.h>2 X! K4 K- |2 n, ~: V8 J
#include <unistd.h>; |  a' c  D- [; n( r3 ^1 n% p
#include <sys/mman.h>. R; t9 C+ i" s  S: _/ K
#include <sys/types.h>1 i9 N# t9 j" _2 p  F
#include <fcntl.h>/ G( \" n5 J4 s/ \

+ X: x/ }1 j/ d+ t6 o#define SHAER_RAM_BASE_ADDR    (0x80000000)$ q1 i  {9 n1 v- t  D- h
#define SHAER_RAM_SIZE         (0x20000)   
2 z8 F) m( u" Q/ f0 e. W/ l& _8 ?: m- R
typedef struct( d/ E. i# B7 M9 w3 l9 ]! G
{( |1 N! L$ s4 u; y2 ~! X9 ]
        unsigned int a;/ @/ i9 @7 b+ F( r
        unsigned int b;
% C/ `1 t( `1 u# a/ F        unsigned int packet_cout;
, P% K* {' F3 v/ z0 v# q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 y- T4 O7 z1 V/ Q9 `+ r) a
: ~( Z- \, R4 P5 o! yvoid read_MSG_buffer(int *baseaddr);3 n1 u- a$ @" ?; t* ^1 J" s
unsigned int count_copy = 0;& ]3 j; p' x% Q8 l/ {& N+ c2 l

9 m; P/ m* G: F% b7 N% xint main()0 _3 P+ i/ |0 U" m
{
# O6 p# k3 M/ N+ f. h, |; S6 r        int fd;
1 _8 e& |+ N/ K        int *mem = NULL;+ X7 N& t/ F1 B4 p
  S$ z! O4 n. O1 G$ ?- J, G; ^
        if((fd = open("/dev/mem", O_RDWR)) <0)
6 q. a6 `0 i6 s; W1 G3 h( w5 w  T' f: {        {
9 ?' D9 \: S0 e* l                perror("open error");" s1 e7 x8 Q* R; A4 V" d* ?
                return -1;- V# D5 y8 y/ q+ w9 P
        }
  f( M6 c7 M9 a* _  ^. `        
' b3 N1 |, V3 t8 {, E3 H' c  W" j0 T        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% a( k# [; l' W' p" {- o) j) v6 \  W" \, {# }
        while(1)
) c5 _! S$ {0 J# d7 v; c2 J! d$ y        {/ Y3 q) k: j. X; B  g2 u+ c6 \
                read_MSG_buffer(mem);
9 z/ Z+ S* j+ C% V7 E2 E- V        }               
' Q5 C: o; u7 `2 Y}. L# T5 d+ n' A3 |# {" J! p* j' M, M
4 q) e( D( U* N
void read_MSG_buffer(int *baseaddr)
. z# @2 s( m9 c7 i0 c; o' @{+ ~- J4 `* M. o( N0 \
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  N. O0 V8 Q' O
+ J7 T. n3 k" f0 r        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;' C- O5 e0 p: o# K) F: h; L

' C4 U) C; V% B$ \4 G        if(pshreRAM->packet_cout != count_copy)
, }1 `  {/ F# C+ F" A" G        {
  x) S/ e6 \9 p4 z" Q+ p0 s) `                printf("a is %d\n", pshreRAM->a);5 U8 f" m  m: @+ }: a4 f
                printf("b is %d\n", pshreRAM->b);/ L% A) k0 B& Q" h0 H
                printf("count is %d\n", pshreRAM->packet_cout);
2 ]% J6 n4 `% D, q9 z; H0 s; x# A                count_copy = pshreRAM->packet_cout;
9 J; ^! r% v6 g        }
  u& g0 T( N6 i! t; Z        else
/ y" g8 b7 D' B, ^" K5 i        {" F) E: c( |% ], o
                printf("No effective message!\n");( |0 c+ ^5 I$ W; @* c! j
        }2 ^% y/ Y  K( _
}+ U1 D" g  V+ G* D! M5 W9 s

0 {- ^3 E. m5 p  o; k1 I没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; f& U9 t1 S6 \+ ^8 Q
8 p& B) f# W: g+ D" e

& ~2 B/ v8 a$ k& P% L' y9 I* c* ?, i

% W5 ?7 T4 ], `4 ]. I+ S, P9 n. r" L




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