嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ; Z8 F* z1 `" Z( J5 Q# D* ?5 F1 a

9 V1 o# O9 u9 D% O; T( A  k, W, s  hOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ L% M% j, O  O#include <unistd.h>
, \& I' s% d! Y( `# w#include <sys/mman.h>+ j' h9 x2 m; h/ ?  [# N8 g' i) F
#include <sys/types.h>
& x& E/ _* ]6 m#include <fcntl.h>4 E6 E& t$ @7 g/ F
" h( ]' x+ [$ f: f8 A* n9 i. l) z& a
#define SHAER_RAM_BASE_ADDR    (0x80000000)   # P- u/ b% i; ~  v8 u* E
4 s6 F0 J0 H2 W  |$ r% @: h: I+ u
typedef struct5 _0 S' A/ @7 X
{+ N; k  S- Y% G2 w
        unsigned int a;% t# m" h9 _7 a; X& M& q
        unsigned int b;
) n9 k1 I* o+ I( u        unsigned int packet_cout;/ W! U' Z6 X3 W5 a1 p. c! B# z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 I% h! l0 E4 }  d# E
# M' u1 |# h1 y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) W2 u; k( F: ^9 ^/ J7 v5 m* U
unsigned int count_copy = 0;- L+ A' j* O7 s9 T  B5 Q9 {
# p1 @$ j( D7 G7 z. ^4 y
! `/ R" r6 S' c5 b# w. r
int main()8 e2 U$ p$ K: K
{& o; F. h5 f' u4 I7 h1 \; @( ]0 ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;1 ^" ]* v! ^. p/ b$ s  @
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ b2 b3 \6 P3 m- [' d$ A5 |0 H+ [/ l2 [
        while(1)3 g: x2 j% k% A8 s4 y9 \
        {6 O% Q% a( B) |+ q% `" q+ ~  n5 h
                read_MSG_buffer(pshreRAM);
3 {$ ]9 d2 Z2 U. S% m8 X' ~        }               
1 v. U0 h0 w' {" D2 s' K8 A}
5 y  D9 ~% |. Z6 N+ p( S
; s) f8 W; D" ?% pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( e4 p# ^) S6 a9 m, V{
: ]: d" b8 C, W8 E        RX_MSG_PROTOCOL buf;
2 Y0 L: t) {# B+ Z( T        
4 z0 H# K- c* q6 M; p+ B! |        buf.a = pshreRAM->a;
" v7 y- F# e& D- F        buf.b = pshreRAM->b;
9 }" N1 w( w, h        buf.packet_cout = pshreRAM->packet_cout;
# S; P: [- U* T3 u        
8 {# `# @. ^9 N1 u3 i2 C        if(buf.packet_cout != count_copy)
0 B9 h( U* a; o) `% r        {
) d9 _6 t9 H. V                printf("a is %d\n", buf.a);
8 H4 I# C" ]9 m2 @                printf("b is %d\n", buf.b);
: B7 @. g8 p% B8 m  N                printf("count is %d\n", buf.packet_cout);
8 t! u3 p4 j  K& O6 ]                count_copy = buf.packet_cout;" C9 `6 K: U1 O5 ?2 x
        }2 e; g- b6 E+ Q3 T& L4 ^$ h
        else
9 F. ^9 u1 E+ I) I% O        {* R4 \3 }- b5 X$ ?
                printf("No effective message!");
. d/ A- e9 C- V0 u0 p) P        }1 t/ H6 |" v3 f  t# d/ L
}
" \% f$ |6 T( S/ F' i7 D1 X
: z+ B+ u3 L/ T# z$ c: u% x4 U+ i1 L+ N, k
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) ?5 }$ ~: v! m4 k9 o7 ?使用下面代码,对内存使用了mmap函数后:
! \6 c  C6 e# ]0 o9 q% L, N7 v#include <stdio.h>+ p: \- [- ^7 {- J; z, k8 l
#include <unistd.h>8 O7 c5 g; w# y8 m; @+ N2 M1 c
#include <sys/mman.h>$ \) V: v" N" S
#include <sys/types.h>
9 F5 U1 g8 O6 |) H#include <fcntl.h>
: y: P4 m6 r$ g1 p: ?4 o
+ B& e2 X1 @3 n5 L& A#define SHAER_RAM_BASE_ADDR    (0x80000000)
) b/ D0 v  d1 M5 j- p1 P/ u#define SHAER_RAM_SIZE         (0x20000)   & s" F8 q- v0 M9 _& b% Y

5 D' F! a' k' [( y3 dtypedef struct; U, K  d; R$ Z& N
{
% M/ s* c& x4 }( ?5 r        unsigned int a;
3 w1 x) V+ _" g        unsigned int b;
+ G- {8 Y: j& c) I, q4 J/ ?, K; T        unsigned int packet_cout;
* t9 u/ l+ o7 d/ G5 t( Z/ ~% N- p6 @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; I' X; ~" [8 z  I) G3 T

9 k' B$ v4 h  k7 S! ?! h! Uvoid read_MSG_buffer(int *baseaddr);
! B0 i; N$ s  h$ r  f9 sunsigned int count_copy = 0;
' ^) l# B( x0 m5 M9 t' f1 \& Z$ _. G" U3 A, S8 t+ Q
int main()$ U" ]7 O* L: }9 B0 f& q  D8 H
{
; `1 ~! ]+ _. I9 w5 x( x8 x/ j2 p        int fd;
+ J+ Q, `7 c1 Z  {" [/ S6 F        int *mem = NULL;
4 G9 _$ F1 Q* n0 ~" y  X1 }
, D, B: z) x& Y$ O+ C; K4 b        if((fd = open("/dev/mem", O_RDWR)) <0)
/ w. p: \/ y5 Y* I        {
, Q! i5 E+ u1 o3 e3 }                perror("open error");  l+ p) x+ R! u
                return -1;
# G+ @4 k2 k' p, f1 ], T$ Z5 c' I& U5 @        }
# p% D% I. h' l/ e0 x1 q8 [; y( J% {        
( M$ q; [2 d2 m+ U% e5 {        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- j* S2 {6 f; D1 y, X
  W, S; {* o4 A, D, h& @        while(1)
0 Z+ ~) t2 Q' c3 ?$ F        {+ ~$ P* M/ K7 r: A( b$ n- k) |
                read_MSG_buffer(mem);
6 A$ }) ?7 y0 z% Z        }               
' a7 n: y/ j" o9 U9 i% |}
9 l4 d4 D8 A( r; G  @7 y% N8 ?2 H* S' [4 @8 @' }
void read_MSG_buffer(int *baseaddr)
  E9 [1 I5 E- g( O7 D' M0 F{$ @+ E1 ]6 k% O' ~) v/ g+ ^
        pRX_MSG_PROTOCOL pshreRAM = NULL;( [$ b) X+ B) c& V/ W0 n2 t- y

/ s3 p+ {" a) Z) W, d        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 X0 X) d8 M4 Y. ?9 C
' N; o2 U3 y# X/ {% @, l3 G# D
        if(pshreRAM->packet_cout != count_copy)5 K4 W+ h9 {9 R3 f) ^  K& X& `: x
        {4 R# @, w) Z, w
                printf("a is %d\n", pshreRAM->a);
: s+ ^% l: z+ x8 C; T* M                printf("b is %d\n", pshreRAM->b);
3 z7 {; `& z8 F! o, ]6 y                printf("count is %d\n", pshreRAM->packet_cout);
# [/ r) i/ P: k: D0 ^  B9 [                count_copy = pshreRAM->packet_cout;: I5 e1 G7 m/ b/ k  j
        }% u6 r) p/ z2 a- F; P. A
        else( ]: {9 X. F9 `# L5 Z  f* H
        {5 z# O  L8 q# v. B2 D
                printf("No effective message!\n");
/ p+ H8 I  M. c) j  |        }! {7 y  @' m* j- n- Q& I
}. b6 e+ A  p6 l0 g4 b  _

" R! v& Z/ I, Y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: ~$ j; u' x& C0 \$ A- G2 F  n: ^5 d. _2 h( n6 J8 W+ P6 k1 z2 k

0 r2 [, \2 S; C( j: f. ?
8 B! T; r# K, J( x6 f( Y7 W, F& }, d8 M2 Z, q





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