嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( ?2 P; E/ i( \& p4 H" ^+ e; l" }9 j6 \6 y  G2 y+ o% K" t' H9 O
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 ^! Z4 c. w/ ?: _$ `
#include <unistd.h>2 m! o) ^; C, T& \
#include <sys/mman.h>0 S7 _1 l- f: C
#include <sys/types.h>3 X; s7 X. Y; Q5 Z* }6 G% o+ ~
#include <fcntl.h>4 _6 R) Y$ \3 @3 J) ~8 E
1 z: F7 B$ g$ ]4 z  s
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
- k0 v7 ~# C- h6 }7 [- {! B0 d8 s
typedef struct9 X# a  M9 p2 `( }( T
{+ ]$ _# k$ }4 i: f2 O, _$ I
        unsigned int a;% O3 H# F; I' b( V. r
        unsigned int b;
/ z5 D) f! p5 W5 I8 N" V% C        unsigned int packet_cout;
" }3 x  a) @) x8 @% v. z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 B0 }! {+ I$ Z. |

8 i2 z1 M, E( G  z- Fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: k; w# R. K( n4 Z, J# s6 A- cunsigned int count_copy = 0;
% S) I6 ?, x8 b0 I, Y- \5 b0 x2 Q! o5 |

5 ]5 U: w9 |5 C% Z- J8 W9 |int main(): Q0 b2 x! g: E5 b, X2 H
{2 ~6 V; _: y  T: x
        pRX_MSG_PROTOCOL pshreRAM = NULL;7 U& f1 \: O- h
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 o, [) r* y. i4 h* ~2 T$ }  i+ ]6 Z5 E$ g# V* E* J
        while(1)
! C8 t9 V+ s' A, d2 X3 o" r+ Y: u        {! ?6 E: u$ ^, H4 P
                read_MSG_buffer(pshreRAM);$ J2 E; l% U0 G% ?- K
        }               
9 P, X, A9 p" J7 e}
/ W, c1 Q" Q/ r5 A: x  r6 B1 g8 {( b2 M1 A: Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 _" j9 S" j& c% F# N
{
6 A9 Q! k+ c3 w4 s! h" b        RX_MSG_PROTOCOL buf;
" J. Y. W+ F; A        ! K  S! M* ~! ~
        buf.a = pshreRAM->a;
0 W9 i2 h$ D$ h+ u        buf.b = pshreRAM->b;
. d) [1 c# q, T        buf.packet_cout = pshreRAM->packet_cout;, R+ q( m* f; o, K, s- G
        $ b& I* i% j( i! n7 k3 g4 g" G
        if(buf.packet_cout != count_copy)
: Z+ k; c! i4 F! E& K$ a6 w        {
, ]6 ^' V0 |; N* a6 s                printf("a is %d\n", buf.a);
5 H4 Y; d$ z7 x0 k                printf("b is %d\n", buf.b);
& u& T! F9 P$ w  [0 @1 W3 {                printf("count is %d\n", buf.packet_cout);
9 p9 T9 C6 v. b( H: I' l& K5 p  O" X  A                count_copy = buf.packet_cout;
& K- Z6 W# g$ J# W, u        }
3 @0 c& {: N7 p: u5 Q        else/ }$ [+ }, w' }6 Q6 T) p; n
        {$ v3 Q5 |. C9 L3 T+ k$ g$ k
                printf("No effective message!");$ `( n& J# ~2 V% L& T* U6 I, `( i
        }1 M8 j1 O7 B* }/ r- f3 K' T
}* e5 R  D' k% f% q! |& T% J: o

2 V* k" A* _2 t. v
8 B. R8 P( c5 d  g; e, y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 Y; ]5 d1 s" v
使用下面代码,对内存使用了mmap函数后:
/ L# l/ ^: {, w9 ]+ w: q2 g) L#include <stdio.h>
7 b3 u) m% W8 p) T7 h( I#include <unistd.h>, T" c3 E; G; a; ^) \
#include <sys/mman.h>9 O% P5 A# a" C: Y
#include <sys/types.h>
/ n3 q! k1 ]( S5 H( }, T# O#include <fcntl.h>
& }$ I7 k; s" S1 s. g$ M7 z' P# |% [4 F. C
#define SHAER_RAM_BASE_ADDR    (0x80000000)0 @* F3 e, i. ^) J$ I
#define SHAER_RAM_SIZE         (0x20000)   
, P  S- @* p) U  S, m& q0 w% P  [6 {" G- f/ t; d
typedef struct
& @0 P' e: |3 [& e7 s: J) w{
: d% b- j1 k+ k        unsigned int a;
. f9 W/ m2 @% Q        unsigned int b;6 Q1 N9 e& Q" Z2 D
        unsigned int packet_cout;
/ F9 ~% O' ~' P$ m5 o( J* l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! ~8 f+ c( d0 j: s
, B  g6 Y8 p( u- w
void read_MSG_buffer(int *baseaddr);
! U! b8 q* v6 Junsigned int count_copy = 0;& j) _1 d8 b, r, F) G7 M
" z# c3 A# K1 B+ g3 B
int main()" L# e& g4 p( S! B
{
; [. V! C, [3 F2 S        int fd;
7 ^9 Q$ _8 x* p% @9 u1 }        int *mem = NULL;
. N) a& q4 `0 U
, ~4 S: W' A# k. J1 d. A        if((fd = open("/dev/mem", O_RDWR)) <0)
# D' s: z. n: F# l9 r        {
. |! ]8 ?/ x& m* C                perror("open error");
( p; t! V- h) V3 A* i                return -1;0 P  P5 i6 M! }8 }& ^* L
        }5 F+ f" g! l) X5 k) a4 @
        
$ G8 a* p5 G- O/ ?; _        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# g' h) g) h8 l, |6 f; }( [+ n1 e* O- t3 a4 L" u2 u: t4 e
        while(1): p. E5 W# J1 s+ \% ^9 w5 B
        {
$ {+ s. ], S4 j/ c$ k7 r1 S                read_MSG_buffer(mem);6 |7 j6 Q! r" H/ ]* {/ P: \3 X
        }               
  G$ f; b# O8 y/ m}
# F! K7 n0 w- K6 s1 ^
' W' }$ k* H+ w/ w* s. i# C, a# Ivoid read_MSG_buffer(int *baseaddr)
/ X: v5 z& R+ F2 x{, B2 C) {* a  l+ e; S
        pRX_MSG_PROTOCOL pshreRAM = NULL;( \4 z' F3 k& G3 P: u3 u" R$ |% |
* K' `1 i7 ^( W
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! N& {7 q2 C- D; t
. Q0 R% E* j, ^& }
        if(pshreRAM->packet_cout != count_copy)
( p3 ]2 C2 T8 j. T' l        {5 S2 B9 r; s3 G  O5 z' x+ W
                printf("a is %d\n", pshreRAM->a);
, }7 r4 Z( f. D" }2 T! J                printf("b is %d\n", pshreRAM->b);8 I  V6 J6 ^0 }) u/ R
                printf("count is %d\n", pshreRAM->packet_cout);" C9 R6 D  n& f9 f4 n
                count_copy = pshreRAM->packet_cout;, w: f- j' R! |7 }4 k
        }
) Z! O  i6 ~3 w* C3 B7 x        else9 N5 {$ E7 T( V% X5 Q
        {
! a/ \* ?9 s' ~                printf("No effective message!\n");; j3 W! s3 P" T1 y
        }
6 v6 d, I7 a5 y/ n3 N}7 c- R) d; I+ M) d

9 j: d4 E( O1 J没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 a1 y3 O+ G, L% Z# q) `6 k% u4 d9 e0 ~

! r/ `: W# S: y; u3 J' S/ q/ X1 [- `) ?1 I

! V: z3 }$ y9 e- J. T0 O




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