嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- V* z1 }4 w$ W0 p( m! X% g/ ?" F  Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 J4 g) C! p: f! |" [+ [3 h1 z#include <unistd.h>4 H4 n4 Q# n: `4 c! H. ?- z
#include <sys/mman.h>: c1 a$ z& `2 V. V
#include <sys/types.h>
9 c/ w/ K- J- u; }: j: |& Q3 A, P. y#include <fcntl.h>
/ R! q+ ]" p5 w( n" U% W; g/ C8 O% j8 w7 C0 T
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* v& \2 ~' \$ T4 R& D: }  G; i( \. b6 j
typedef struct0 N7 U) B0 w, X! L8 d/ b5 G
{
' A4 `* P/ H. t8 [1 ]        unsigned int a;, l* _/ _/ ^$ n1 M8 O% Z$ E
        unsigned int b;0 ~% A0 y4 \/ d2 H) V
        unsigned int packet_cout;
; d% i! t3 ~. x! z8 X6 M4 D( o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, C1 A, p$ I) B, W( E
1 b! C, X7 ~8 J5 W! P8 j6 p  p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" x9 B/ d, X6 a  e8 g8 K# a
unsigned int count_copy = 0;7 L* _* P/ f( D* Q( S( \# v
+ n9 ?6 N, t  ^/ J, O, e

8 H' u8 o9 |% j, m/ v2 y+ J5 F7 U. jint main()6 s. R' v* q6 c9 t! a
{
6 `0 G) g- N1 v0 i' O        pRX_MSG_PROTOCOL pshreRAM = NULL;- [7 ~. ~& D5 a0 H4 f/ P
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: Z6 ~! R! M! E! v, q9 P( i/ @6 k4 x, _# u* ]2 D
        while(1)
- M3 K  X, g3 D& W        {: m( X2 O4 \  a/ K
                read_MSG_buffer(pshreRAM);
1 v- Q; }2 X8 E6 |5 @# c        }                . n0 b2 l3 d  m' Z& U. I
}
( G# W& R& [  _) T* z( C7 u' H% \" W  ^5 j+ h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& v' t# V" T0 d. w
{7 B; B+ f8 l  w
        RX_MSG_PROTOCOL buf;
3 D( s' y7 z- k! b/ H7 r        ) Q# }( Y7 G9 J* a% U; L
        buf.a = pshreRAM->a;
( W& F7 h3 C1 y/ j" u        buf.b = pshreRAM->b;( y; b. q+ q7 W* j; @, `; d" q
        buf.packet_cout = pshreRAM->packet_cout;
  c6 m! C7 |8 X+ v+ V8 o        
. Z) c8 f% y" H: D( G: c1 g* Z: ~        if(buf.packet_cout != count_copy)/ x! j! c& M4 M
        {; C0 Z: |% i) U' W/ o' F
                printf("a is %d\n", buf.a);/ c$ V8 q$ C8 F0 V; @; q
                printf("b is %d\n", buf.b);6 e1 }  Q" X6 F' _; h4 y3 w: U
                printf("count is %d\n", buf.packet_cout);
# L' ?/ d- a" w2 y4 w' Y9 r                count_copy = buf.packet_cout;
7 U: w0 g; [, }1 I$ J        }
! p% k2 m4 a) @9 j( p        else
) l9 p3 z. ^' \# d" R        {  J2 j8 j# z7 O9 q3 }6 u: J( t9 c6 H
                printf("No effective message!");
% I: E9 ^0 V6 B/ P0 x( z; ?        }
" i; I0 N* l0 Y1 f. @" e9 P$ s! O}: }$ c3 u  p8 Y
) B) b/ [) F  ^5 u7 w

8 U  W2 ~8 h. W& t7 ?7 ]& b( c但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。  q' f: j" I0 X0 x9 a& F! t; k- n
使用下面代码,对内存使用了mmap函数后:; H2 z2 {; K0 G) k9 w! I, t0 v3 C
#include <stdio.h>
3 @% M; o3 ~' h#include <unistd.h>6 z* Q( W& S, V* {- P
#include <sys/mman.h>. E9 t+ \: s/ I
#include <sys/types.h>
/ F; J3 ^2 u$ B& a' w#include <fcntl.h>
% Y2 |. q! z) U" W" y6 F
4 E& a; x- l' a4 D3 Z#define SHAER_RAM_BASE_ADDR    (0x80000000)
' I4 _9 o# o: @8 ?$ `% U$ [#define SHAER_RAM_SIZE         (0x20000)   
6 I9 J7 c4 z, [% n7 Y4 y; Y$ M  P& q) y1 J
typedef struct
. V! N7 A, u/ C. @; V{
! s% f3 C6 {1 B  Z0 w. }        unsigned int a;
9 C* D0 X  U0 m8 h. p/ W- O: V        unsigned int b;
0 ^) w* @# O5 Y        unsigned int packet_cout;2 Y( N' ?3 ]" q/ ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 i8 T8 ?! K' z, M& @7 v4 q+ ~% j) `
void read_MSG_buffer(int *baseaddr);, h% V7 R9 M" S
unsigned int count_copy = 0;
; i" \) O: l, S$ c+ Y2 h: b! R! v* r/ h! W  E5 P' _
int main()4 \" V% ^! R: [! Q) l4 H. o
{" p# Y6 M' r9 C  A# h
        int fd;
# m+ ?8 Y7 k8 k; N' ~4 |        int *mem = NULL;3 {7 V8 v  a; @% D& I7 T

% y! c/ H% R/ h; `        if((fd = open("/dev/mem", O_RDWR)) <0)
) R! |* y7 B' t& P2 B        {- v; ]$ Q* }% w; j
                perror("open error");( W( r# K8 Y' {& c7 n9 M7 u
                return -1;
8 B* o% k/ e+ D; J1 ^' I3 C" N        }5 \9 l$ M* q: I! B) V+ V" a9 O
        
' U' n% G/ D# \6 l        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! N1 n! a& A! m) c
+ Y- V8 c: k2 b  b. P/ A' @. I        while(1)5 l3 P& v  x; S
        {; Z( y3 v2 p5 |* f
                read_MSG_buffer(mem);& e; f/ F" m. G! {: e
        }                4 K( C7 i3 z3 g4 Q
}2 _+ s1 J7 C/ T' h7 q* [
3 c0 @; Z$ u0 m8 }: v% }
void read_MSG_buffer(int *baseaddr)
* \& t% ~- `/ G" d/ D& M{
% q  n& Y/ p! {7 N9 y3 }        pRX_MSG_PROTOCOL pshreRAM = NULL;* G- @% @  O0 ~1 a, {! F

( i- o8 a: v$ u0 A# f        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 P1 C! L# P7 I9 U1 M7 R( A$ k& O7 V* m4 _
        if(pshreRAM->packet_cout != count_copy)2 |2 ]# x* q9 Q3 k2 \. B) f# u
        {4 I4 e1 i5 R! @2 u, ?0 f
                printf("a is %d\n", pshreRAM->a);6 v. v2 k! E; p: i6 f
                printf("b is %d\n", pshreRAM->b);
; f# l4 m" e* v                printf("count is %d\n", pshreRAM->packet_cout);* J" L. V$ Z: q- v# H9 V% ?8 ^
                count_copy = pshreRAM->packet_cout;8 g( p1 s% P9 H' [7 A
        }% a  f& w" u8 G$ c
        else
% u7 a1 Z4 s1 b% S, U        {
+ u) R' H5 E6 G- A                printf("No effective message!\n");
. g" C5 L7 J7 s# ~# B2 p        }% ]4 w% n% I$ Y- V1 t# r. I
}
/ Y  {' V. F+ h0 S8 s2 h4 C
, O$ d& a- q" k) ~没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' h' A- J# x! m0 J7 {

' W& B" N& w  a" b' X5 A" l" {  I, X6 h, @2 v! ~

0 a, W! O5 i( ?8 x$ h9 Q
, o3 o1 p. g0 ]  l8 t




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