嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + ]( E+ f: E, \

1 u$ \; Y6 H, n3 H9 p! e6 COMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: F" H: |! j3 k6 b
#include <unistd.h>4 u9 @: y6 i3 |  U, Z8 _4 x# Q6 ?
#include <sys/mman.h>
& `+ R6 o9 ^0 H4 o* l#include <sys/types.h>
% S  B' C' ?5 l- k- @. m#include <fcntl.h>1 G8 T8 @) y/ y( _: `" U# w
" \* @) X' B8 ?6 z9 N( x3 H. z7 w
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% L) I; \- q. D, S1 e: ~
9 i# @) ?- ~" @4 e3 ntypedef struct
. |5 j# P, ]* \$ {, ]1 ^{, m9 k0 x9 x7 [" e3 ^3 B: V
        unsigned int a;
; ?  E0 b) x' N% }8 M% d2 x        unsigned int b;8 x# p$ [4 K& b4 v
        unsigned int packet_cout;
  U. t8 E. P% p, n  a* i/ X9 b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 B+ G+ w  y4 s* v1 [- w' S* R' n' h& p* W) v1 m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" P3 h' K, e; Z; V" g
unsigned int count_copy = 0;. I9 A  f% j: t; I- }

9 j4 R( U+ N- @6 z( z
$ g3 K2 T) o0 _int main()
9 B( [: \% y' I  P# {% H{% D3 q. d9 S, ]/ c
        pRX_MSG_PROTOCOL pshreRAM = NULL;5 N; {/ W; s8 ~
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 S% e3 q" F/ A2 F# ~1 M+ E- F) ^9 n
5 S; f8 f" j( v6 U
        while(1)
, R9 a% |6 U! D: D0 L. B% v        {
% u5 [" t& m) X& l7 [7 R% `8 R- E. P                read_MSG_buffer(pshreRAM);2 h; b+ F. E4 W9 `2 j
        }                / b* i9 I) d7 ~
}
8 d% a. n' L3 n- G
  Y5 x! Z2 h/ B9 o' B" i" h+ Z* gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 D" m* T& F7 E
{1 U5 G2 G) K4 I. G
        RX_MSG_PROTOCOL buf;
* a6 G+ @# m- X# q4 ^        
; j& C  E/ R1 R3 ]- {$ [        buf.a = pshreRAM->a;2 j# A7 l9 Q. B; z2 c
        buf.b = pshreRAM->b;/ i6 h5 B! [( N8 Z
        buf.packet_cout = pshreRAM->packet_cout;
" M, G9 h" c2 {# E, O5 s        
& C$ C; T' D# f# `        if(buf.packet_cout != count_copy)
* [, |( L1 W" E        {
" F; [5 R" ~; o' ~+ G                printf("a is %d\n", buf.a);. A+ o5 w1 l8 ?# E
                printf("b is %d\n", buf.b);* k  b. `# H% w3 l  ~# l
                printf("count is %d\n", buf.packet_cout);
  _0 P% U2 f! X                count_copy = buf.packet_cout;
$ G3 U7 ?5 u& ]  c: D7 d, v        }
' w; @9 U" i3 J) ?" l        else
% _& ~6 z5 t( ]        {% |) h& c* ]- z5 z/ N7 U( M' n
                printf("No effective message!");
4 e2 o- g  D( C3 w1 z$ _        }; ]: `% h9 r) i% F
}0 t, ]) h& ]  a
$ g1 k! y' X: O: }4 q# K0 n

, i) I0 p, D/ E但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( g" m: e! F8 I; _/ I- R使用下面代码,对内存使用了mmap函数后:
& Y; Q3 T+ @% x#include <stdio.h>
1 V$ {$ T* M3 R! |6 T' g. B8 k6 z4 v#include <unistd.h>
( W; L9 h( l* T$ n2 C1 _( ~#include <sys/mman.h>! B/ X: f( O6 {& N
#include <sys/types.h>
/ J" h3 x/ k% b; V0 |& z5 `#include <fcntl.h>8 ~; J# L- \- _* v; N
4 y9 f! f8 x5 ]( m; B! D9 ]
#define SHAER_RAM_BASE_ADDR    (0x80000000)( ?/ f( r: I0 W# Z2 [% U" G) X
#define SHAER_RAM_SIZE         (0x20000)   8 j9 Z' K% G% x$ D" ?: r% r8 j$ x4 H
8 O+ M8 W  A; `8 U- S- C/ q% T
typedef struct
$ u, o: a6 D8 u% \{3 `7 o' g; f( m- s  _0 i. M1 w- C
        unsigned int a;
& W) @' B, k3 c& U9 R2 V% O        unsigned int b;
! r6 Q, }% U, f        unsigned int packet_cout;
' Z; q' ]- h* t9 R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 c+ j9 k8 g4 U" F6 u$ N1 Q7 J( l- B0 j8 f/ b, z
void read_MSG_buffer(int *baseaddr);
( x( y0 O6 r; s9 n1 Cunsigned int count_copy = 0;
/ o' w4 N1 Y  v% x% f2 z" w' t8 T6 g- e# K: |. }; a7 |
int main()
; v* S- G3 Y1 k5 a{
* Y/ t3 l( D% U( v        int fd;. c) D2 f9 B: e
        int *mem = NULL;
5 |& t+ B! C. ^$ t9 N6 F  Q; l1 P! d7 e: [) m1 d' o# j( C
        if((fd = open("/dev/mem", O_RDWR)) <0)7 [" |) @0 G9 r1 I& V, w* E
        {8 s" n4 y2 j+ r  }
                perror("open error");( K. O& V4 p% Q4 S  j  K7 D) U1 B6 {
                return -1;
6 d& S) N1 n9 P0 t6 Z        }$ [$ J) H3 D2 x
        
' @: g9 w; ~& p, Y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 g) L: F& C2 o0 `7 n! l5 l# `, o
        while(1)
! m5 U, y3 |% H- o( {9 X        {. A  {5 {  f( P$ ~$ a$ v0 U
                read_MSG_buffer(mem);  b% x6 Y3 ?' y$ b) G
        }                6 Q# O8 n  j4 `7 u: ]
}
5 K5 \# Y" Y- @( t$ |1 h
$ |$ g9 q. D! i) R9 b  hvoid read_MSG_buffer(int *baseaddr)
/ p9 B; Y* ~& W& n3 g{( g$ ^& l, a& T' }  B# `5 W
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  w+ T3 J3 L. q' ]1 @; U" d" A8 l8 Y3 B' Z
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 S' t( j3 c/ ]
" v% D" w6 D9 w  j        if(pshreRAM->packet_cout != count_copy)
9 A$ c2 E) e- h  Z# `        {8 l; K0 f3 j6 ^* J% S* }
                printf("a is %d\n", pshreRAM->a);
. Q2 e) Z: q0 y4 Z                printf("b is %d\n", pshreRAM->b);
; b+ n% N5 K6 d5 o) [                printf("count is %d\n", pshreRAM->packet_cout);8 s1 z: _  p6 u; R6 d% T( Z
                count_copy = pshreRAM->packet_cout;
! o7 N( L  U- [3 m; w) h6 |        }
; b- @6 ?( B( Z8 B5 ~        else
7 Y* f+ u7 T  n8 ^6 S/ S. B) p        {4 M. G: h, z( L* ]4 O" x" |7 R* K
                printf("No effective message!\n");
, `. w" Z% ]) ~        }; T% y( B1 f; i  P2 P
}* u( m' N! [5 Q3 d1 @

. H+ O8 @2 f/ e3 G* g没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. q3 R, C$ @1 \

; x/ z* `! d- j( r" f6 O; N4 B! }: r: ~+ c2 {  ~" I

2 V6 B7 g) p# g, E* z2 e
6 a0 J/ x5 d! N, t" }& `




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