嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 K+ ~4 G; j9 E5 ^/ k  p

  t1 M* C4 f8 |! D* Q: j7 b/ @7 SOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ b% A; Z; d5 x2 j; M
#include <unistd.h>
- ]4 n; U7 u5 a9 G, Z( s#include <sys/mman.h>
- H3 v0 X( M' |" \7 H" Q3 K#include <sys/types.h>
8 F$ g7 M) v! c6 z6 B' H#include <fcntl.h>3 s4 X% }3 d$ k8 L! B
4 O9 E* z0 v, D+ z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! L0 `- j6 L! C9 p8 i6 q3 M3 H% j

9 m1 g9 {/ d: Gtypedef struct( `9 a4 {* p+ o, y8 j9 d
{/ f! v2 F5 h, w; q/ P2 l8 ]; q
        unsigned int a;4 F2 b6 h* F0 y# V$ J0 V
        unsigned int b;
3 f! K( V: N+ T2 ?$ j        unsigned int packet_cout;
( R! V& a  d" u6 e1 D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ R/ c+ A0 r; Y* F; }3 o# l% b: Z* k6 f; P  H( F: B$ N7 w' z+ y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 I; M( S5 g' ?0 K3 Q' k
unsigned int count_copy = 0;; B! H( i* ~$ q; E, O& W
. }( C, l9 l$ c$ a1 `
! B4 L9 t; i, n0 e
int main()
7 I0 ]- b# H$ d2 M) U( \2 |' a{
' b2 M. F6 w- v        pRX_MSG_PROTOCOL pshreRAM = NULL;! ~+ K8 H, E' H1 y: ]$ o- K: i
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, W* R" z& p1 ?/ {% N

9 x$ Z) e# y& J* N6 ]+ h' r( w7 E        while(1)6 _$ G% Y) U5 O" H; C
        {) N: t' M) i+ n
                read_MSG_buffer(pshreRAM);
. o* }+ D1 T2 y        }                6 v' f4 j1 _+ }8 z* s. l
}
9 q6 q/ R4 r5 m! c
; U6 a' ^8 q  K8 b# Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, R  w' c3 O/ C6 t{% x3 t/ `9 N4 Z( _
        RX_MSG_PROTOCOL buf;1 `; h7 O5 d. C' L5 C2 H+ Z
        
: Z9 ]6 o4 Y9 a! W        buf.a = pshreRAM->a;
6 \$ p8 g3 F; d6 m' ]        buf.b = pshreRAM->b;
* X) _! G' o+ B        buf.packet_cout = pshreRAM->packet_cout;* K* I# h8 |8 ]1 _/ v- `
        ! j$ A5 a5 e* m* }+ ]* H
        if(buf.packet_cout != count_copy); {$ y# o) A$ k1 a& K' R- _/ c
        {3 D7 o# r5 T. e. }1 D5 {
                printf("a is %d\n", buf.a);2 d* ?2 K. A7 Y* x; w% {. e
                printf("b is %d\n", buf.b);8 i! e( g' a; L% a5 a2 S5 G
                printf("count is %d\n", buf.packet_cout);% X5 x: s- |; \4 r$ d6 a( E
                count_copy = buf.packet_cout;1 e5 `, u$ x5 z
        }
5 S6 h% h) ^6 C2 z4 M        else& k' N, G0 Z0 |8 ~' B% c8 L- Z
        {
2 j) g8 T. [* M" T                printf("No effective message!");$ ?6 F3 Y8 L4 s* u/ H
        }
* |" s8 [3 m7 G' a6 `}3 D( A' s" u! A" o7 b
1 k9 L& d# F/ S2 H

$ l" r' i& l& j8 [: F, f; P但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。3 d. e5 H/ W  f' s" G- I; D
使用下面代码,对内存使用了mmap函数后:- a1 j8 b4 h4 G
#include <stdio.h>
+ C7 X5 L" H/ q6 P0 z7 W( x" j' _#include <unistd.h>
) f$ B1 l9 H$ |3 m4 U#include <sys/mman.h>/ @  j  S$ Q% C/ T9 ]
#include <sys/types.h>/ G$ w- K2 E3 Z! w: w9 d
#include <fcntl.h>
1 M" |0 `( B8 p8 \$ V5 m! x0 v1 ?5 }6 m6 `& Q" g
#define SHAER_RAM_BASE_ADDR    (0x80000000)  [, T3 e1 o) r5 c  ]* e) p5 o& S
#define SHAER_RAM_SIZE         (0x20000)   4 _$ F! X4 n& M, R& d

# o! N6 `8 b, Z3 q9 o9 S% ?* |typedef struct
  Y3 U1 _5 Z5 E! H: P$ v: E$ Y: |3 {{) x8 X3 I8 C! G# T2 v$ ]* T
        unsigned int a;
% x! t  C' s: {( O# S/ @. z- g        unsigned int b;
8 e, G7 E+ L: m: ~, L9 _2 k& P( G        unsigned int packet_cout;4 N  x: P0 ?% j8 ?8 P- d3 M; P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: G; m; T7 G8 t) M. U: r! |
: D% L& |5 c' ^void read_MSG_buffer(int *baseaddr);6 D" c# K; u' K: P: P
unsigned int count_copy = 0;
1 t2 z8 Y- L! G* s# H8 J) l9 q. D. l7 v7 A( D" h3 L
int main(). m8 y- D; x. \
{5 B! I  P& m" w) J0 V
        int fd;
" V6 P2 C9 N2 S. H% ~* V' G        int *mem = NULL;
0 v$ H0 C! h" X3 W8 q# _$ h
4 F$ u3 n/ Z2 e/ a/ x4 e- W        if((fd = open("/dev/mem", O_RDWR)) <0)# U7 k, @$ C  @% P& D
        {
6 M% l* ?: d+ X( U( c                perror("open error");
  x* \( i% F% V! S; {                return -1;; |1 w/ T! U4 Z; M) m4 D
        }' {6 _+ [7 {- Y! v: d& S- y
        
9 U5 g- m0 W+ X9 _/ `        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& ^( s0 _$ e+ H& W: i' |3 |) t' z, P% B8 ?9 `
        while(1)9 M, g! c7 c5 k
        {  Q6 y0 n, G( x, k" C3 |  X* a
                read_MSG_buffer(mem);2 ^. R1 Z1 {1 ~4 [; @
        }                3 ~7 x0 ~* x/ \% b6 R' r
}' z# S; |9 k4 ~
  _+ r; h( H# H- d/ H: J
void read_MSG_buffer(int *baseaddr)
0 j$ J" F& g$ \{
/ f4 d& y4 Y9 P. d6 b  _, ?        pRX_MSG_PROTOCOL pshreRAM = NULL;$ E8 |" t0 V" r+ s) E" q0 t+ x
8 E; l) ^1 a6 X- N$ S- l
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, D6 R  Q0 y! `! ]' ~1 ^% W

- N+ f8 a* f! W+ c+ O* _; I        if(pshreRAM->packet_cout != count_copy)# _2 @, N; {6 {2 g7 m+ n
        {8 L0 Q6 H5 {/ z! h3 t) g3 }
                printf("a is %d\n", pshreRAM->a);1 B2 D5 n* C" O
                printf("b is %d\n", pshreRAM->b);
' F+ M" k8 _3 c! X                printf("count is %d\n", pshreRAM->packet_cout);
; h/ E/ l: |4 j- ?( G                count_copy = pshreRAM->packet_cout;+ m6 y, [$ q& X4 |5 B! r3 }9 C& s9 i( i
        }. L* \/ S5 a& U! O
        else
1 g4 ^# A" P- n        {3 i8 r) S9 o  h
                printf("No effective message!\n");
( n3 y& G9 ^$ [; b' ^+ {1 l: f        }( r7 K* P3 f1 n4 a
}
9 R* l8 x% x2 D! I  }3 D
- |: e" |' G& e没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  J2 ~+ e! ]: N& P  s! t% u# X* x* |

" f3 c) ^  n8 P  @" ?) G* |
1 ]. O, k/ E% w. G/ z0 U7 ?$ M
% x: s; H# B$ R6 T1 h/ d3 [
  k, l. g* U8 O9 U' n8 y




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