嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 J2 f5 ~7 J$ l0 ~& B7 K: x/ p& [6 z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ d: ]4 W" ~# I( V& Y! ^' u
#include <unistd.h>  O3 I# }- n) O' ^8 s4 m3 _
#include <sys/mman.h>
, n4 b$ F  p( b( ?' R#include <sys/types.h>1 [: Z; N; N' _
#include <fcntl.h>/ T( M5 q/ c9 {3 R/ D+ n& V8 e/ s  C

6 g0 X  U4 j# L' {; L1 E% S7 G$ ^#define SHAER_RAM_BASE_ADDR    (0x80000000)   * Q% R7 B2 |- O" {
; R' M4 m; z4 k; b0 u! d. |
typedef struct0 A) o2 @8 {3 _6 M, L( R
{4 n; G& |. v2 d8 d+ c) H8 V- S4 i
        unsigned int a;! R& N1 ^( Q# L* d) L$ g4 Z
        unsigned int b;
( }; H  A9 a& ?% d        unsigned int packet_cout;
% n; \- w$ v2 K}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 ]  J& y* u% Y( q0 q$ h: m% a! X3 Q% n" J% L" B1 ?9 o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# l& T6 F4 P  m* b9 Xunsigned int count_copy = 0;: E8 X( B' c3 A" J
' \1 P/ c1 y& |  _7 W
( z" V% M& h: S
int main()
+ y3 Z  _0 I  n  H" f{
) I- X3 @: T) @5 m7 g& @5 V+ H        pRX_MSG_PROTOCOL pshreRAM = NULL;# F3 t- g% p8 R. z6 q/ |
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* s, X! \: M& m- _. t" U+ p
; V( V8 ]) j2 V
        while(1)- l& A9 Q: O$ P& \( v  p  ?
        {8 \" t- b# ~, B  P/ M
                read_MSG_buffer(pshreRAM);7 @' L2 C: o1 c" A, x
        }                ( q0 d4 t4 s* O7 z; Y* L3 x
}
" z0 B6 S$ s5 F% Y3 s9 t% A( H0 r. m0 w& b0 g0 s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ u" Y3 }4 t0 X
{
# `6 q# Z- ]  G3 L8 {        RX_MSG_PROTOCOL buf;. t' V' l' V3 n, \% z3 H
        
7 k! f$ }! m. j* W1 f! x; {1 g8 V! a        buf.a = pshreRAM->a;3 c* T- a) t7 k; G
        buf.b = pshreRAM->b;
# k- o: W" L! m) {8 x. o" d        buf.packet_cout = pshreRAM->packet_cout;
* E0 T9 j) Y/ |$ ?        5 s9 I4 B" U5 N4 y/ x" R
        if(buf.packet_cout != count_copy)
" Z  g9 i2 c* a0 C        {
  f* o% Z4 s# \: Y7 Z0 f5 I                printf("a is %d\n", buf.a);- U4 P' P8 g8 E8 ?8 O9 B
                printf("b is %d\n", buf.b);
" T8 j! _2 Y& Y                printf("count is %d\n", buf.packet_cout);
+ [; L+ M0 R, u8 K1 q                count_copy = buf.packet_cout;) e- `& t1 }6 M1 K4 s4 Q. U
        }
$ A) ^. _2 }) {3 ?; R2 }4 f        else
5 M" W/ s3 @9 [        {
( q7 x6 V' J; P4 E% b. v                printf("No effective message!");* K6 c$ \2 i1 z% P6 y6 `9 H: ~
        }
" i' |1 B- z+ h/ {- k7 e}# a5 B% Y& N6 `5 @* V8 T

% J2 b; m! [1 G1 n/ f% i
" Z1 y, j, A! G7 T1 X( B1 e但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。* C1 |% J& S2 O  X
使用下面代码,对内存使用了mmap函数后:
2 ?7 {5 I% U& n0 `+ j' G1 E( c# Z#include <stdio.h>4 Q, E, w; p& B, `$ j4 |2 X9 W; u
#include <unistd.h>/ k+ {! c7 W% y% y
#include <sys/mman.h>
% g+ \( F$ f* _9 X#include <sys/types.h>( e# }7 Y; K9 _2 g& }
#include <fcntl.h>
4 N: u9 ]5 C/ U5 E5 \3 B: h. Q1 j$ K5 d! o" }! c
#define SHAER_RAM_BASE_ADDR    (0x80000000)
/ H+ G& \' @, I3 p. a$ R- @#define SHAER_RAM_SIZE         (0x20000)   
7 U3 d  H3 ]. \& p
& v/ }$ d* _- C9 Mtypedef struct
2 e  D! P# `  l{
* G. j0 A- Q+ L; _5 `, J  }        unsigned int a;
  C6 n, p1 ~3 n        unsigned int b;
0 b8 q5 x+ ], F+ a: r3 a        unsigned int packet_cout;
. c, h) `) W3 T: O2 I( U& m1 Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% \0 q* k4 A; l- I: w
- L! Q  d# Z) w. i8 w1 e1 L
void read_MSG_buffer(int *baseaddr);
+ \9 m, Y- G6 j# }4 G7 v1 Runsigned int count_copy = 0;
" |7 i1 q0 }0 B5 m% X* R8 w7 S: u7 X' f! n. h( d
int main()6 r; R) c5 Y3 ^6 V- g' G9 n! F  P
{1 C* n$ U8 Y0 C: ]* Q
        int fd;
6 z5 Y0 P. X$ r) [        int *mem = NULL;
$ ?9 a& e2 j3 N% o  b; v) \* z7 ?$ V# m: V( M; _3 g, b2 Y0 L9 s: w, i
        if((fd = open("/dev/mem", O_RDWR)) <0)9 p: H! [# L1 x) j
        {
  @6 P# m5 i0 o: K( `                perror("open error");9 E+ Z1 Y8 t. b7 z+ B
                return -1;
) P6 i6 N3 H. q/ b3 `% x        }7 E$ ^3 B" K6 K  h# s4 j
        ' J: v' Q, N0 T) a% z) K. Q  H
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( s* J* @4 M4 ]3 Q- s* q- ]9 o

6 Y. N- P  R% K% @4 x8 J        while(1)2 @# U- V6 `, u" ?# J% I( V
        {7 e" z9 t& @4 j- k0 g* X" Y, u
                read_MSG_buffer(mem);  x6 M& B' K; J9 d4 [+ N$ K) w
        }               
+ h# Y" N. R" p4 d( ]/ i5 j& s0 T}- C0 U3 u0 H) N; |

8 D0 P" f; V2 P; K6 O: C- Gvoid read_MSG_buffer(int *baseaddr)
6 z5 R  U7 Z% o; v  b- C{
3 F  ?2 P4 N1 R6 e        pRX_MSG_PROTOCOL pshreRAM = NULL;
% A1 i& q- Z/ p  ]/ C. D' n  \+ R" y( w5 D3 t
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 @- p9 D: I4 S/ @3 X4 q
4 {8 h; D7 E& c
        if(pshreRAM->packet_cout != count_copy): d4 B$ u) ]! Q2 V' ?* l
        {% ?+ m2 V" K7 @5 V
                printf("a is %d\n", pshreRAM->a);
5 e# Z0 o8 |+ w1 \( D                printf("b is %d\n", pshreRAM->b);
$ C* d# C7 U: |) r                printf("count is %d\n", pshreRAM->packet_cout);: r6 \/ o6 _( k4 l' ~
                count_copy = pshreRAM->packet_cout;9 n0 H2 r# Z3 K2 f2 ]" c
        }
  S4 p2 d1 @" w. s: Q. u        else# }! N7 K2 x  G" \; N) t# W
        {' N& A! ?0 v' ?) `; z
                printf("No effective message!\n");- Y7 o5 M' ^" ?
        }
7 M8 @. S, u# }  h: d) F; W}# x( h+ i% B  A+ H

3 Z3 j' [9 b1 B7 }3 e2 h没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- [0 ^5 I) h& z: P. B

5 R; i" `  M+ T2 B$ W, q, G% t/ H. G

' h/ V+ T7 s# K" }* E) j( T5 k& }3 _4 w: h% c  T. P/ A





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