嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ e( i: [. E6 k# {% @# N2 Y& L7 Z
; |7 h$ L" J2 A" B0 o3 y3 `OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- A0 ~6 G; F4 b
#include <unistd.h>7 i3 b7 |  S" w! B- i
#include <sys/mman.h>
# k2 t- T* c& `8 m#include <sys/types.h>
  \, c' B/ {+ I$ [#include <fcntl.h>
/ e, {" s  ~; q- g8 }9 w% [
/ M8 D, u( j- P8 g8 J: [#define SHAER_RAM_BASE_ADDR    (0x80000000)   7 E# R5 V& G% k) t3 K
1 \# L- M* k% \9 [
typedef struct. X* _+ ^, G; `" m: y
{
5 A4 y5 H& q' I! N. P) {/ }        unsigned int a;
! D7 k. T' \1 M% `; T) h6 i. Q1 R        unsigned int b;
. s) H8 R4 e' \* Z/ i        unsigned int packet_cout;
9 d2 n4 ^" p. {6 M$ u# W# p/ l+ ^; b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 ?; H4 b& h3 ^* k! u

" O( O) x, i: y2 t  Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* z$ y; b4 ]: m3 B( [" R! junsigned int count_copy = 0;
# X1 t$ u) E2 h, p  e6 ]* o
7 Y. F: b  g' ?) T- {6 b8 v6 A* t9 [- S7 a& |) h
int main()
5 ~4 e" k" T, E$ ]7 m: F{
7 D, }+ I! l5 t4 Q) z        pRX_MSG_PROTOCOL pshreRAM = NULL;  K# g2 u) I  N6 M
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 E6 [. m+ Y) J. x4 j2 ?5 H6 {4 B+ X+ I6 z" [
        while(1)
" P; a, A- x# `4 M        {
2 A1 I  c. z$ V+ F& k                read_MSG_buffer(pshreRAM);) l8 q$ b3 ?# D/ W* K& Q
        }                ' N3 Y$ e* {) v. B/ S# U4 L
}$ l7 [" o% i/ A6 h# X' z
% Z' q0 c/ s+ l$ v8 Y- q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" w1 _& S/ @, p{/ G4 m) _5 q" F0 C" i
        RX_MSG_PROTOCOL buf;
7 a8 x5 h% }, {5 u: r        ; Z0 Y$ O  v2 m0 U9 W, k' h$ ^
        buf.a = pshreRAM->a;7 [5 Y% q2 w7 q5 n
        buf.b = pshreRAM->b;1 L, [4 j/ N! f$ K8 R
        buf.packet_cout = pshreRAM->packet_cout;
( `! \) j; d8 e6 b7 M2 D# f        % U+ }: l0 B8 e1 C) G" {7 l
        if(buf.packet_cout != count_copy)
6 i( A1 D& ]  V1 S* @        {
6 d0 C% C+ O1 h& U( p. Q                printf("a is %d\n", buf.a);' Q: }+ r' y+ k! W% B& f5 u# e
                printf("b is %d\n", buf.b);
$ Q* E. X% I, `( V  X! S' b4 v                printf("count is %d\n", buf.packet_cout);! e: _" x$ N) I
                count_copy = buf.packet_cout;# m5 ^3 H6 b5 R2 B- l$ R
        }
6 r* s! Z# z$ N% i        else' d; T$ i) |- v. X: |
        {
$ ?5 G; R% u' v6 a! @                printf("No effective message!");2 w" t. }0 y2 z' I# d0 V" y) ?
        }3 C" {: l! ?  ^0 ]! T5 I2 E/ [0 e6 X
}
  H% d% [$ F: L) `/ t8 u6 ~/ I- A# D2 x

/ s1 [6 j$ c" |: _) H( S但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 l( w0 l" s* W; [* [# L4 f
使用下面代码,对内存使用了mmap函数后:
3 W3 `; P- ]2 l* V' b% D) U& a( Z#include <stdio.h>
# [- F- K. w" b& U  }* W#include <unistd.h>8 r) y* y/ f( M% o
#include <sys/mman.h>
: l. ?* F! g* O#include <sys/types.h>! B* {: y) y* f, ^9 \, g" W& q
#include <fcntl.h>
" L, O/ G, i  S" b" b$ `) d  B: S+ j+ f3 n  @1 l; k( u& k
#define SHAER_RAM_BASE_ADDR    (0x80000000)3 a, s( g5 h5 Q( a* P& \
#define SHAER_RAM_SIZE         (0x20000)   , b' g- r* J: `! |" N- Z& Z

. I+ n$ n6 v0 a4 X* b* |7 J! q- Xtypedef struct% N6 U! K; _6 ~& F. X" @$ p
{
7 }0 d9 O8 J$ K' P6 U        unsigned int a;; q6 @# t6 x3 w' `1 ]' t
        unsigned int b;
8 y' x$ x1 T0 P7 g) f1 k% M( k        unsigned int packet_cout;3 @# \) L+ u- f. Z  {1 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 H( ^& x( u+ l! N
& E' E& a' z0 ~, q% d: I" `4 T
void read_MSG_buffer(int *baseaddr);
% ?2 Z: O& C$ ~% X  E7 |* _5 hunsigned int count_copy = 0;
6 y9 b/ t# j: v: W* G' u* e, T: b1 J& K# ]7 ?3 u  q
int main()
, F5 Q6 V! v' l1 M  [  q! ~{8 l" l" A! I# C# w! l( l
        int fd;1 H" j3 o& H) R' P
        int *mem = NULL;2 s4 N" X6 {  _3 j8 x  w
- `' b. F% \) f9 d$ q" x7 t
        if((fd = open("/dev/mem", O_RDWR)) <0)$ T0 t9 x7 g" W$ U
        {' _1 N$ K8 Q: P( {  `& Q
                perror("open error");
; j) T# {' w$ J% q( M                return -1;
& S! b/ Y2 U) J5 ?. w9 U" [        }7 v7 E$ f+ ^5 A, @1 Y& ^
        8 p6 L# E* X6 @7 l4 K2 L
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: r1 v' I$ G7 ^1 {( G5 n/ j) M

4 {' a; D0 E) c1 F  }5 v        while(1)! _# y  V& U3 T$ j( F
        {$ f) J0 }! u) z
                read_MSG_buffer(mem);- C& C8 _- C% Z3 o+ A7 h
        }                6 e  i/ W% j. L3 U( d* {
}
; o1 N/ M1 [# f! x4 q0 x* ~: E, N6 e  t) i$ _
void read_MSG_buffer(int *baseaddr)1 a$ U0 N& G2 w5 n
{
' o$ C) l  _8 ?  E0 B, U        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 `2 o: S5 |6 S) b2 G) H! N
: s5 l% _! m7 l        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  F8 e, {% F" `, X  |, i: ]  d* Y& q8 r+ z, l. V
        if(pshreRAM->packet_cout != count_copy)
* I) D1 V. R7 B        {
* ?) q" E5 d4 n" S/ ^% S- j                printf("a is %d\n", pshreRAM->a);* P, ~7 e( w, Q6 |
                printf("b is %d\n", pshreRAM->b);2 Z) Q  o  K+ p) l. e$ ~
                printf("count is %d\n", pshreRAM->packet_cout);
* P' y) e; f7 G8 c                count_copy = pshreRAM->packet_cout;+ F; C( x, `( _/ @
        }
& R' A+ l1 G, G' y        else2 i% V. X. f1 c8 X  r
        {
$ c: m3 A2 ~, ^" u6 }' U7 J                printf("No effective message!\n");
0 T. T* Y8 G% L, m  s0 E! j3 F; u: L        }# s. C; b1 }  w
}
# ~, v1 }5 y0 Q: T2 o6 w) h: [9 A: m' b1 |
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% w8 I5 \/ R4 S% U* c" i* p
+ Y( r1 w2 Z5 J

8 E% H0 S, v7 Q3 u) x; f$ X* y5 P! P* J- ~" ]$ D

8 |% \% ^+ J' i6 E- k% P$ z




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