嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( v. j, e) I* h+ H6 E  k$ @; m. x, q3 o
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& {5 ]* O4 H3 @& q8 [; @#include <unistd.h>, x, \, m/ r, Y) V$ M4 D
#include <sys/mman.h>
' r8 ]- w4 q  O, `( `+ x0 s#include <sys/types.h>& W. \. B9 Q( r, Z: |( |
#include <fcntl.h>$ |6 ^* ^; M) m8 D$ ~- h% l
, w% o' D7 Y6 n7 [4 s
#define SHAER_RAM_BASE_ADDR    (0x80000000)   : \) j' B1 b( j* ~) @  x
  {8 G# m* s/ u0 a3 H2 F
typedef struct
& H, V9 p8 ?2 p/ D. W{0 `% H. U7 x/ m! l# F* O6 J- P
        unsigned int a;
. X7 z# [7 I$ k0 [2 ?9 n        unsigned int b;) k: Y, l" Q' a1 a. {" u. S9 o) m
        unsigned int packet_cout;
+ ~. A) X. T; l1 Z& s# c( ~2 V$ K}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' y( f. p/ L4 A5 h
7 H/ i! F( p, B. v% Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; ~% U  \* l) H$ [9 Funsigned int count_copy = 0;" K, r; b  d9 q( G% |

* p. ^. d( S! |/ ?) @) o
; ~9 j5 i+ \' ^) j# F  @int main()
* y" h, }) c, n5 B{
0 [2 X1 _7 V$ `: g3 q  B2 T        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 B) r, g7 `! q  ]0 b1 @; P: X' C% c        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 [) Q) g4 ?& U- a6 Z& @
# \: i  W7 a, y, X
        while(1)* J" v" T4 i+ \% Y: a8 G
        {
6 T9 F$ z- v8 {. H. a                read_MSG_buffer(pshreRAM);! ~1 M5 [& I1 u1 x' b$ g: D
        }                ' }5 G0 b. E6 P  R3 h0 F+ ?- z
}
+ W' M; i7 T/ ^6 m. W. e5 ^, }. C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 w7 ]' H& Z5 S/ q# s- H{" j2 p1 [+ a$ v( u, d
        RX_MSG_PROTOCOL buf;$ X" C' y+ }: C5 `& `* c- A" T
        
4 B7 S8 V0 W0 \8 P- p, i% w        buf.a = pshreRAM->a;0 Z' t" t5 h: T) D# c3 s2 t  H2 S
        buf.b = pshreRAM->b;( f; H' k; X7 K
        buf.packet_cout = pshreRAM->packet_cout;
! l  Z0 W& ?3 x        - L6 {0 r2 \8 R( g8 @$ x0 ?
        if(buf.packet_cout != count_copy)
0 Q4 @* B3 B: ~- X9 d' a/ f- g        {; C$ h3 l1 H+ t- G: k) t
                printf("a is %d\n", buf.a);1 g3 F  Q* I2 w; w. r$ q5 B7 V
                printf("b is %d\n", buf.b);
1 n% j% {8 d4 Z. p+ R                printf("count is %d\n", buf.packet_cout);
1 h# k, F! \5 i& X                count_copy = buf.packet_cout;& I6 ?, |1 }2 |2 d
        }4 c* U1 c3 L+ U' Y! J  C
        else$ o  I2 ]2 N" p/ |
        {
0 g! a$ ~2 P& y# n3 A' _! u# m8 W1 D                printf("No effective message!");
6 i4 r2 {+ i- Z& K& S, }3 s        }* H% ^  X( `1 {) H5 T
}
; O5 I. c1 j0 W8 L6 v. C4 c$ R7 T2 A, e  q& y, b4 a

$ n: {, K1 z# h5 M) f但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; ]/ j) i( S3 |( ~( v
使用下面代码,对内存使用了mmap函数后:7 l; a/ Y3 i/ w  I# u( e
#include <stdio.h>+ i, `: Q3 b5 w9 m3 G& ?) F( A
#include <unistd.h>: L' X7 t! z6 a+ c1 P: {3 f
#include <sys/mman.h>) s5 }* m3 h2 n/ [! W2 |1 o
#include <sys/types.h>! Y! E9 [9 a& @. X
#include <fcntl.h>+ O% A" C) W4 ]" {
! f7 b+ o5 I7 g3 F% q) I
#define SHAER_RAM_BASE_ADDR    (0x80000000)* w8 s) O/ a' H/ c. `( \
#define SHAER_RAM_SIZE         (0x20000)   2 [9 b& X) S" R. i' r8 d  h
; z" A9 a$ l1 p9 D1 J# _
typedef struct
! L6 s% w, @/ z: S( O7 Q  Q# k- I6 O) r{0 C, T1 u  i* R$ R
        unsigned int a;% U4 d- S5 y4 H7 \8 v$ }
        unsigned int b;6 z: a3 H2 F; {, b9 {, `' m
        unsigned int packet_cout;% z( q4 n) S1 ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 E: E5 E2 |. T

- U9 V% \) m  _void read_MSG_buffer(int *baseaddr);9 k) v. _1 p+ q1 c( E
unsigned int count_copy = 0;
2 s+ x  D7 @8 l5 K1 E9 P5 ]( p. N  j" `1 \5 ]# r1 Z
int main()
. p" T# [8 H" @) r9 o% H) W{
5 h+ H, L+ n4 m/ `! [        int fd;' s+ e* L1 ^# {; v# H1 f1 ]# j
        int *mem = NULL;% o7 z1 C2 [; M6 Z* p, g3 _% q4 e! M
9 m: a  d7 s) `7 G$ H8 |: A
        if((fd = open("/dev/mem", O_RDWR)) <0)3 f+ D& w' l' z. v+ @8 P
        {$ u' K2 X5 t, v
                perror("open error");  ^* Z* M, @/ V4 _4 h6 `! D$ N
                return -1;6 @9 ^, L2 q" A3 P
        }
: F6 v* S& F7 F' }$ t2 g        ( n' G; y$ a$ y9 F  _/ f3 I0 @
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, K; P  P, E% D+ Z% i, x
1 b/ L3 A6 Q& j        while(1)
5 l  \8 p& [. G2 V6 @7 m2 h        {
6 \' Z  ?# G  R/ j1 H; h2 u1 @' b                read_MSG_buffer(mem);8 }/ X. L( e, D+ |
        }                8 G; w! t2 ?# u
}
+ B- X# |  v) f4 x1 g* Y& d! o, H$ k" Q& D' @: o0 s7 L3 l5 z# s
void read_MSG_buffer(int *baseaddr)
5 l: _2 Q/ ^& b2 P{
( d# w; }$ @/ ]: K. S8 ]. G& |) C        pRX_MSG_PROTOCOL pshreRAM = NULL;! h2 w8 E: v# `1 B$ W5 T! [- y7 P

( r0 B# E) D4 ^' t0 G6 a! r" B        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;8 c1 {. s6 f! h9 H* \
; p  j2 T- e* T& k
        if(pshreRAM->packet_cout != count_copy)3 X! l. \( s- y9 ]% m3 u: R! J
        {/ X0 L8 s* D% o' K- s- P
                printf("a is %d\n", pshreRAM->a);
" o* ?6 {" }8 }4 K9 X% H; Y2 Q                printf("b is %d\n", pshreRAM->b);* V- j$ ?: n# }, d* z$ ^
                printf("count is %d\n", pshreRAM->packet_cout);
9 ?: D) w7 H8 K+ G: [9 J$ d                count_copy = pshreRAM->packet_cout;! G% V. G7 o$ w: b+ R2 M
        }( h3 s6 h0 t" S+ _* {- m% j* w$ X
        else8 `' t/ N3 n4 }/ S5 F3 A/ K) N) d
        {5 V$ d4 k# t4 @' z0 ^* y8 ]3 j. H
                printf("No effective message!\n");) ~; M2 U3 u1 d* I) s# A8 `8 Z
        }9 H& Y3 z2 `) t6 e/ I
}
+ N6 \9 z' h; X
) J6 C6 J& M7 |没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 y# |0 i0 F6 E, G# a& ~; r
* I) z2 m$ S' x  U' K9 C6 x( a5 [  \: J; x  o
4 V3 K! R0 N' `* |
- v) k; z1 e9 t6 W. [





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