嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % r! C% X/ `2 p# F8 X& T

9 q! c5 h# g5 MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 u; U7 I- T- M) d$ Q, v#include <unistd.h>
5 b4 k( K- b% Z& A( z- N8 A#include <sys/mman.h>& m& a. q" S6 X0 ~' L. e8 e/ k
#include <sys/types.h>* J9 X# g. R. c( f( A  e
#include <fcntl.h>, q( j6 u9 X. |+ m; ^) U# y7 S

( ~9 c5 f) z+ }+ l, B+ `0 b5 W! I#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 ?% N* r: Z6 c: H
4 f: v( {; l8 e) V7 U; H! ]typedef struct6 A1 k! E$ g, L& r; Y" `; w* r
{
# K1 M  z+ F7 t( X$ ~3 q' G        unsigned int a;
& ?$ v$ z# [- t( O  `. q, b8 w0 U        unsigned int b;
' o0 ^' X8 U9 y" }" u7 ~1 [        unsigned int packet_cout;
% M6 z0 ]# S2 l) O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 C  X1 y$ [" ]! s9 D5 |" P

8 e( E' s2 j6 W% Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 v4 d& I  x! l. ]! g. X5 w
unsigned int count_copy = 0;
- D7 @% v% Y7 \4 u8 t$ A, j" {/ g  w1 x& K" M# _! U
/ j! g& X1 ]* R. f
int main()2 n* i* E5 l# f% p' [
{
: D% W3 ~+ ], O        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 J& r- ?# @) H- g        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. A; I' N8 q: c& l' ]7 K- I! v2 u1 v3 J
        while(1)
4 `; x, l; q" d) c8 K, p        {
: G; C: Y& H% K8 B                read_MSG_buffer(pshreRAM);
5 Q1 ^) C. q) ]" [        }               
+ a/ h! g: n6 ]/ b2 M5 K$ d6 c2 }}; C% p3 s& G* y  h: n+ P2 t' t
0 Q% W, m! M* [* k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 w/ z6 J2 p3 p# l2 a. n! r
{. N7 ]; X$ V9 r: B# ]6 B0 w
        RX_MSG_PROTOCOL buf;
! _- w. Z: C6 y1 Y) o5 \3 z        
% ~& U4 M* `5 |( y2 k        buf.a = pshreRAM->a;
( ^( `$ B. o. ^' K        buf.b = pshreRAM->b;# c& t1 ?( J5 n1 f. m
        buf.packet_cout = pshreRAM->packet_cout;$ a  s7 _3 z8 y- D7 e2 E2 [
        
7 \6 ^7 [8 u. p) H' r8 P        if(buf.packet_cout != count_copy)" N* D2 G. J6 f8 a
        {
% P0 j" W: N0 O4 R8 K- L/ v                printf("a is %d\n", buf.a);  e& ~) @+ X7 z& J+ w# h
                printf("b is %d\n", buf.b);
3 r  Z; {$ K( P  ~. `! s                printf("count is %d\n", buf.packet_cout);
' ?7 @0 ~2 l% P+ ?3 s                count_copy = buf.packet_cout;9 C& L" I5 x8 {; ]
        }" a- `8 e2 U- U( n7 u# ]8 b
        else
% T1 u- D) \2 }. x4 Y* I3 Q" N        {
: E' @/ c% ?  s1 c6 c9 v/ A                printf("No effective message!");7 h8 q4 p% K4 D2 G$ u  V
        }
: _( H$ Z* v8 ~}0 b) l# e! D4 O; R

% c# w3 o, l8 j; r6 p* l8 K5 a* Z8 f, m% C. R( e4 Q- i
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 m& `; T% `3 g
使用下面代码,对内存使用了mmap函数后:2 e2 {1 A$ y; U1 d/ P
#include <stdio.h>
+ i  n# b2 P* _; v& {4 p" i#include <unistd.h>
# h* f, N. P" q) Y$ R" f- H#include <sys/mman.h>
: n  \2 ], e" N' R#include <sys/types.h>7 H! N/ }9 P: b" U. L
#include <fcntl.h>8 B$ l0 l* D- C7 t) s" r0 }- I* a

' `6 t+ S; W; C7 S#define SHAER_RAM_BASE_ADDR    (0x80000000)/ f( \/ D; m7 S" h7 q: X: }
#define SHAER_RAM_SIZE         (0x20000)   
3 \8 I  y/ D3 R; Q6 g3 L6 U9 q' c* o! P
typedef struct
7 J6 R: ^5 x: e4 A{
9 E! l2 t# Y. c" x        unsigned int a;4 z- M" i$ D7 \6 U! o( E: r1 n) [
        unsigned int b;
% U5 w  g6 ]) V5 q        unsigned int packet_cout;; K% t( f- C, v! x# Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 o- G) P: t. l3 S# r
; T1 h9 e3 P6 i) ~4 [7 ^
void read_MSG_buffer(int *baseaddr);/ A! R& u4 H5 G
unsigned int count_copy = 0;
; S' }! s/ p" Z, D2 w) a, @' m. K( w; x! d
int main()0 l- K# U' l; P; b1 h
{* X8 F  q9 `# N+ g# L
        int fd;8 R8 g7 g: O' K0 |! m2 a
        int *mem = NULL;
& Z5 b& f5 l% A' V- w
2 \9 }( \& I8 C# d) ?7 t        if((fd = open("/dev/mem", O_RDWR)) <0)8 d- e: k$ u; \8 v
        {1 T$ i  ^# s( v# D) N
                perror("open error");
5 K& T( g. F, P3 X4 R6 Z. q                return -1;' z# y; T+ [* Y/ x( R1 H% g
        }" ?) u6 z- u2 z3 k3 T  v5 ?6 g
        & s3 c" p1 Z1 }7 a
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 O; W% \! R0 V3 G! l- B  r3 J, v" G% }
        while(1)  I. z8 {. }8 K- A" r) d8 c! m
        {
7 w& Y( l1 P$ g2 g0 E/ T. e                read_MSG_buffer(mem);
! b% C& N$ @. C# G4 h3 Y        }                $ S7 V/ u% P  n4 k7 @7 P
}
( @) S& |8 l  @, o1 K
' f3 \$ u, ~% uvoid read_MSG_buffer(int *baseaddr)
0 T+ c, R( i0 o* i- W4 y{
! F3 C/ R: r. v) y9 E        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 ]0 E/ x- \, k( a
; C- d/ {, h! c: U        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 y( `& q8 n1 j+ A( A) O

: _( ?2 P5 M( j        if(pshreRAM->packet_cout != count_copy)' j' w9 m8 \( _+ p
        {
# ?+ E3 q3 G, a, K3 b+ o& j                printf("a is %d\n", pshreRAM->a);0 ]- Y* i4 c0 K4 l
                printf("b is %d\n", pshreRAM->b);! ~% H( ~9 I4 n) P: Z5 X* d- |
                printf("count is %d\n", pshreRAM->packet_cout);3 F4 l6 {# V- |8 {1 F" _2 P
                count_copy = pshreRAM->packet_cout;0 V( Z( J% b# ?- _9 a
        }
/ E* E1 c' Q) O        else
+ C( o9 h: K* n. P6 s; P* c        {* u9 u  \- t& K1 D  ?. ], p
                printf("No effective message!\n");
) p9 z) ~" o0 }: f' K. ^        }
- g: u! K+ X- m% q8 ^. a& t}8 p3 U! `6 i, i) \) i8 V
8 ?' G1 H, L7 k! d, O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 B2 E' D* Z3 ?- N; |' s$ l# D
- t' w' {# l1 Y* A6 y9 _! e8 b
6 s# _% W6 Q8 q, q( m; v/ O, |- y

, z) P; G4 V. i2 x8 ]$ x8 k6 y8 Y. ?) J+ U" x2 y9 {+ I6 C





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