嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 P3 k, T* w* c  G3 J) k( R9 N6 w
) U& R* j  e; k. \OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, Y# F$ o* d$ B+ p% l
#include <unistd.h>/ ?9 f2 t6 D" H& D( r
#include <sys/mman.h>; i8 c( m2 {% W' B
#include <sys/types.h>
6 n8 o" F0 z$ c% c. h#include <fcntl.h>0 m9 N, p7 b: T# D, k

" o9 [( Z1 L2 w9 g  ]8 g0 K. G#define SHAER_RAM_BASE_ADDR    (0x80000000)   
. J: y0 H3 G8 A0 w) [: E# m
( I. J- [! u9 E$ C3 C, d3 Ftypedef struct
/ ~! R' f& A1 A$ J  |( \- {0 \$ l{
7 h7 \( P4 u  F- M6 y# d! q/ V        unsigned int a;7 o0 `$ m6 n5 e8 |( y& t
        unsigned int b;& N% X0 q4 g& U( ]: a/ b! f
        unsigned int packet_cout;( d+ x/ \& j0 G( h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. T3 k! I8 T1 [7 o) V# }  `  Y. `

% w$ d# W+ H8 E8 h0 b( j# c( Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 s7 C& z% `1 Cunsigned int count_copy = 0;
. d3 @" S! N4 R* S* m5 O# L: a; S, c# {$ d
7 K' T. S% I& D& m3 b0 O
int main()
4 x. m7 I& O" ]9 _( p( I( m9 S{
6 V5 E; u4 ]' X/ ~        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 D) L: p) ?% D) _        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% Y. C$ ?4 v( e9 w
) ^, A& o3 x& N) |        while(1)
% H5 V5 T$ n, |# {  c$ x4 L9 R        {
! A. e! T9 |+ x' O                read_MSG_buffer(pshreRAM);
* M* e9 [4 B8 x* i- ]4 A. g        }                6 A% T( `6 H' C$ J; `
}  S0 A9 B& ^  d4 ~" _
" }* m. B  V! Y' u# ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM): }0 `7 R* D8 Y# f, h
{
( B  e( j' e* \4 M  x2 h        RX_MSG_PROTOCOL buf;, J! ]1 ]$ U7 f/ F
        * D3 A0 i7 |3 D
        buf.a = pshreRAM->a;
& W6 E. B" k" [: N( D        buf.b = pshreRAM->b;# {  u: F6 g& Q0 H4 b
        buf.packet_cout = pshreRAM->packet_cout;
; w% R& w3 E/ e) ]: ~) m5 t( ?        + g; v8 m& }3 h; X& h& u+ G+ q
        if(buf.packet_cout != count_copy)9 n7 P* h& p! Q, V( P  S2 V2 g
        {
; m1 m: n, r+ c! r! A: |. L& L                printf("a is %d\n", buf.a);. `" \' ^( ]! q
                printf("b is %d\n", buf.b);$ R) ]: @( I! b- m2 v3 C: S/ N
                printf("count is %d\n", buf.packet_cout);8 S5 F7 s, g) x5 m
                count_copy = buf.packet_cout;* J; f9 k8 S  ~* Z* \& a
        }
/ J+ X2 K/ |% _5 O8 x% k7 ]        else
! c2 q  n7 o8 [2 }        {
: e: v6 A) J: U: n! z                printf("No effective message!");
5 x! Y0 X4 B. \- l. q        }" b% A% g7 q0 P7 a: A* b7 I# G6 A
}& w* ^- X! m5 Q/ {
8 v) P8 I1 \' F8 G, H

, B: y9 x3 }- A3 j4 S# ?4 F但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 y7 w5 J, }  }6 v6 L: ^+ D
使用下面代码,对内存使用了mmap函数后:
: x+ U7 k( ?* P3 D9 e$ h#include <stdio.h>; \5 g" z# _; Z8 z3 l
#include <unistd.h>
, o  n! ^0 W0 v* O3 c4 a#include <sys/mman.h>
2 a. W8 _9 `4 a3 t! B  |#include <sys/types.h>
: h, D$ C- S5 D/ X#include <fcntl.h>6 e8 a5 W1 Y. P) ?# O' f

' _: ^% e. B, g#define SHAER_RAM_BASE_ADDR    (0x80000000)4 E; J1 i, o; u/ E( o
#define SHAER_RAM_SIZE         (0x20000)   
( a  N6 S3 Q6 Y% l2 p
* {; G8 O& M: wtypedef struct
7 J8 h3 l1 j% O. A0 |: @' n{6 b7 J) ~5 h  y6 b0 I' R- `5 |
        unsigned int a;! j. m% v/ t; G* l, i# X) W
        unsigned int b;- Z0 o* Q- d, \
        unsigned int packet_cout;4 s8 u3 Z7 f+ f5 j. s' I' s. P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 R& J  x4 Q- b0 ~! x4 G( d
" l& |/ ]! M! \+ U9 `void read_MSG_buffer(int *baseaddr);
% P4 y! h& j& k& _unsigned int count_copy = 0;: c$ s" D- s7 X2 E4 p

7 J7 v% D% i) R! Kint main()
/ [# p( R2 t6 _. E( p# W{
( y: @7 b) L7 i4 d0 ~        int fd;$ U+ [. [- w6 v( z2 ^! s$ U
        int *mem = NULL;0 D1 t' ^1 u& o* M' Y& x, ~4 p6 ^
) D# M) G2 x: \
        if((fd = open("/dev/mem", O_RDWR)) <0): L% z, d, \- P: N) f' J
        {* I6 K. w, G+ p3 u6 s1 x
                perror("open error");5 f/ B6 [1 z4 v% }4 G% j# q
                return -1;
2 o; W- ^. t' o% v2 l0 H8 r+ |        }3 _$ {6 |, r; x4 i" }8 p
        ' f) L  ~8 C5 ~( @7 e6 _. T# A/ S: e2 j
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 F/ N6 I- h; y: c! M3 Z
3 Q' W+ ~# B, |: Q' o- U$ K* T
        while(1)
4 ^7 _1 y9 V1 y+ x9 Q. ^        {
5 a# V' V; {/ n8 M! t% u+ u                read_MSG_buffer(mem);
" g; U# k6 g9 T9 N        }               
4 c2 _$ F6 \: j- q7 }( @2 f$ i, Z}3 U* f+ [- E9 k% w

/ K  A3 |* J5 Z' O5 gvoid read_MSG_buffer(int *baseaddr)! }% ^) Y9 q  S/ l1 b2 q9 y3 u
{  y/ \% A# v: y, Z6 G6 ~
        pRX_MSG_PROTOCOL pshreRAM = NULL;) Z' k1 t2 g8 }

: ^. ?- m* N5 F7 `6 y        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, G% Y( M& K5 Q' [. r  k

9 d* ?: Y7 D. J8 `2 V4 A        if(pshreRAM->packet_cout != count_copy)% T  l2 m! P2 l1 L
        {7 ?9 N- g3 ]9 R9 x& P
                printf("a is %d\n", pshreRAM->a);* C+ ^$ d2 J2 H
                printf("b is %d\n", pshreRAM->b);
" Q% u. f/ k: A) W3 t# o9 B7 i9 L1 t                printf("count is %d\n", pshreRAM->packet_cout);5 ^) O0 p: Z2 w, s& x, \
                count_copy = pshreRAM->packet_cout;9 H/ V3 u5 v: E. I
        }( a$ n8 a' F4 U
        else
6 Y2 u# i9 d  |/ ]        {
/ v3 g  p. l# z& k0 |! L/ t4 d                printf("No effective message!\n");
) p1 ?' E: ?; E* j        }
$ }3 l1 m9 j1 S; R8 r}
  a# n% |4 w- {. E# M# C% ?/ H2 w" y# `: L3 h* u' l
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 a5 J4 E# |* @7 v: W: }. A  Q  Z* Y. t' l9 \% m) @1 N0 r

- {4 Y1 U3 a. B% s. p  Z, n) J2 M- |) J! J/ T5 ]1 K7 Q
. [, V  e& ~8 Z0 l. r





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