嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ w+ y- {2 s- H9 H  F
0 o2 f- ]) {( l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 \" p( F: H: v' Q; `( N1 s8 }
#include <unistd.h>+ r6 @9 y9 _' \( f  U2 ~, m! M
#include <sys/mman.h>  w% w' N$ A4 S, L  d$ ]3 L
#include <sys/types.h>
, |9 P8 b& P- w1 D#include <fcntl.h>: r+ h% k' B) l, @3 Q# j: d5 `/ v8 F; N
6 C; h! @/ U9 x9 d3 _# t
#define SHAER_RAM_BASE_ADDR    (0x80000000)   4 `" [8 P+ C$ e- W! J6 n

3 J+ _2 c& K* I8 \, ^2 {1 x% a# y$ atypedef struct
! a, Q9 r9 ]" e1 j7 {& G& ^$ |) [: M' U{
; a$ c3 a2 H( B0 o; f. b7 j        unsigned int a;! G3 e2 o: P- q. i
        unsigned int b;
/ ^  i# Z3 e# K- Z! {% A! Y        unsigned int packet_cout;6 b: g0 F3 \! P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) k/ V( v; {/ l' J

* j3 D- c- W$ f' K" ^& avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) z6 u3 ?6 q! i. Iunsigned int count_copy = 0;/ u5 w6 F% `9 x* x) N) L9 O5 e
6 C4 D/ n1 M/ p/ v& t- \7 a

4 o5 x8 p$ B. W' Lint main(), N6 J& Z' u; E+ y! Z7 F6 G
{( g& R' _) }! V$ a; A$ @1 Q
        pRX_MSG_PROTOCOL pshreRAM = NULL;& p, B! d7 y; Q! n, @
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- s' q( n4 f+ r& n
: p4 Q5 ]4 [; b$ P9 g9 X
        while(1)
( ?# t. [& D: V6 a4 p/ P        {) W' M. }, M6 h( a
                read_MSG_buffer(pshreRAM);9 ^2 ^" z9 ~" r8 N& v1 j
        }               
# \. p0 p8 c% Y/ g. J2 @}' V( K' u$ r% t0 i) x& Q# h# W
* D3 D* O8 q  J) R) P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 U; Y9 E" W: f2 `0 P9 R& \
{
- _; F# ~* U) t9 p        RX_MSG_PROTOCOL buf;
3 m& p/ W; n$ {1 i' D6 y2 l        
- ]8 K, r: u# z: C' ~) \9 x        buf.a = pshreRAM->a;
6 N* R6 _* Q* E  F        buf.b = pshreRAM->b;
" B8 n8 ?+ c+ J        buf.packet_cout = pshreRAM->packet_cout;9 h1 Y: U0 {/ L# J, V9 \
        
" a- y8 K6 R  ?( \$ v        if(buf.packet_cout != count_copy)& m1 y! S& E* I' W
        {
5 C! j6 e: f/ z! f0 I8 M0 U                printf("a is %d\n", buf.a);
9 i- p0 \; Z7 t                printf("b is %d\n", buf.b);  J: _  k% `+ f2 ^# t6 H
                printf("count is %d\n", buf.packet_cout);! p3 H2 V% B8 O6 O  Q
                count_copy = buf.packet_cout;
) o7 Q+ `. W0 j$ p$ F        }/ x) A3 n, l/ [8 ]
        else/ z* e5 i8 B+ r$ U/ s; l. l
        {
0 ~- ^; i, d# B3 Q3 t  t8 `                printf("No effective message!");* i# R1 F2 O( z3 ?3 ~- j5 I# h
        }2 K5 O! ?8 x- |1 @/ W
}
. R9 T5 F, }& Z) U2 {; e9 v1 i+ K7 _3 X% g
/ d9 W3 D1 F- g$ G1 V* O/ G: d
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% U$ w* I7 o* b  C1 U使用下面代码,对内存使用了mmap函数后:) g8 e; t1 Y# D4 {. T& n
#include <stdio.h>
3 \+ z) y7 s) e4 @# R& c3 X#include <unistd.h>5 z$ {9 @, @% M$ w, h4 x
#include <sys/mman.h>
* R0 X( G- r2 B4 v0 p2 u#include <sys/types.h>1 s+ o( |$ |& m" q/ m. \. v5 z. w
#include <fcntl.h>( d3 R- Q! w5 D+ I, [! {
5 z) g1 D9 ?8 k, y% ?
#define SHAER_RAM_BASE_ADDR    (0x80000000)2 T$ E% ~! ^! k, w/ @# t5 ^
#define SHAER_RAM_SIZE         (0x20000)   ! K7 Z! u5 N, A5 j

1 E& S/ ]4 q; d' ttypedef struct( [$ L/ q! i3 j/ U
{) w$ |. z2 P6 y
        unsigned int a;
" s2 \0 b: q% [4 h        unsigned int b;
0 O+ _5 R  T! y        unsigned int packet_cout;
. P3 `. r* Z5 n6 K3 x7 r% i# z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) [: ~" Y) a5 T. y6 c" J
+ @" S# E1 a/ L4 Z. e0 m. y6 lvoid read_MSG_buffer(int *baseaddr);
8 v* y" q' A; E) a7 u: s" ?6 X7 |; L6 Tunsigned int count_copy = 0;
# H) N; n9 _3 `, @
' r) s  t' J; [) M4 \8 t0 Mint main()6 L4 p3 c- [" [" X( N: z: r
{
+ ?4 O, T7 c' S4 d- C        int fd;
/ A& Z5 O9 d1 h' `0 S+ E8 M        int *mem = NULL;: y0 Q1 D2 v! [
# g% f, J* }; P; y/ O
        if((fd = open("/dev/mem", O_RDWR)) <0)
: \7 W6 I. _( \        {5 W9 m, o& e! e3 y4 z
                perror("open error");
4 P* ^6 F% K- h4 V                return -1;
, m8 C7 R# J  _( @2 y) U        }& }" O4 ^' Y: B0 b2 r
        9 [* p5 A) Q/ Z9 F1 }; K! B
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);  ~7 J# |2 Y4 t7 ]) d: L+ Z
  Z3 v: U2 ~2 V. d( C8 p
        while(1)5 B% T8 B& M! y$ h' v
        {
$ h9 Y* E9 N! |5 @                read_MSG_buffer(mem);  y4 x1 y( _, m
        }                , `" q7 j! A8 q1 J" K% @
}9 [9 Z3 H3 q" ^# ?
: j& |: e6 \" `, G  }% H
void read_MSG_buffer(int *baseaddr)
! y- H. m, @6 P4 z1 m  M, M{
7 P: ~0 u' Q* s2 Q        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 ?, S4 Q. g9 i' x: e# E  Z3 Y! O1 E/ N
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
) n+ o7 o# {) V( W
, ]7 t' K0 K) o* i9 ~        if(pshreRAM->packet_cout != count_copy)
/ Y4 I' G0 _- P/ C/ {/ S& I- e        {" l* _1 ]. }6 X1 l
                printf("a is %d\n", pshreRAM->a);4 x4 d) C. G/ F8 c5 Z1 M
                printf("b is %d\n", pshreRAM->b);2 c# Y! B: X1 ]/ ]! A0 g9 U% ]
                printf("count is %d\n", pshreRAM->packet_cout);, T+ U9 O5 p, p3 ?6 a: N
                count_copy = pshreRAM->packet_cout;" N/ g' l; m7 z$ E
        }
. V9 ^# J& m5 N% Z2 G; I# ]5 f6 P        else
9 x( x6 M6 ~. G, }/ I+ o        {
+ S0 R5 X1 i* i/ G7 \; d* c                printf("No effective message!\n");
* P5 U) u: w5 u        }. Q7 ~& O: a3 B7 O+ |! Q
}
& f0 M( Q9 Q2 [3 B+ o
0 F& w) t) T% H% s6 x* E没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( M$ u: b9 n% A, g, ]0 m
# y. W( T) T+ i
/ {; G! w: ?; u+ c
! Z, b# s% J8 l' b
  _" y9 W0 m4 d





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