嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ v" J% L" x: L0 ~6 H
* C+ ^* D/ o% b" D" jOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! X/ e6 Q1 M; n5 f) q
#include <unistd.h>6 _8 c8 ~2 O0 t6 N3 a
#include <sys/mman.h>4 n" n+ k* S: V! {4 q- w, a
#include <sys/types.h>1 L2 N2 p7 h/ c6 M  C
#include <fcntl.h>
; P- T" S( b$ m& p& E/ W" v- ~
% H  h7 U# K9 t+ R& m7 H#define SHAER_RAM_BASE_ADDR    (0x80000000)   
( [  o* [/ L" L7 [' d$ f% U( X: y* s4 i8 O
typedef struct
# f$ Q. c/ x) x# p- }+ W( }/ l5 d{( F* p; k9 R& b0 @  k4 m
        unsigned int a;& F' U* |  ?2 A2 l* O2 E
        unsigned int b;
# Q2 |5 c1 g( s* j: x        unsigned int packet_cout;
6 v' s: w' T' G5 n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 |1 a' @6 \' q/ h) H4 g
8 [/ F8 C9 D% vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* Z* _5 H8 o- h$ @8 u4 Tunsigned int count_copy = 0;
2 H9 u5 m4 z2 f* P/ q8 h
. B' h+ c" U" ~! B
4 b0 U, Y+ z( b' tint main()5 _7 C9 e; Z" o, f6 L9 L
{
. ~1 r( i( t3 P! f$ V9 i, G5 L        pRX_MSG_PROTOCOL pshreRAM = NULL;
' d3 F9 [0 H. i7 K. q, P7 w6 q8 p+ i( b* x        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. Q3 r2 w+ c$ ^9 n6 O( T* `  J, g& U" e0 m
        while(1), Y( v5 O  j8 o- w# ?  R: p, q* O
        {
" F7 {0 p! o1 Q$ Y  _# c" U7 [/ }7 Y+ s                read_MSG_buffer(pshreRAM);
# K* _. {; ?; F9 H8 k        }                ! x$ K; v$ _% g7 B/ p; J
}- q  C2 j4 X3 O5 s! Q& m

8 v, \; L' l( o- [% S' o7 N  Svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, L0 ?0 w% g: R1 Y# _$ X{# m& L# J4 d* M4 Q4 w9 G" }- |
        RX_MSG_PROTOCOL buf;
8 x! R; h7 b+ y6 k$ Q        
" L/ S9 P! C9 @$ D& e        buf.a = pshreRAM->a;
% j" J; x/ H* T1 H        buf.b = pshreRAM->b;% y/ E% ^2 U3 p9 g7 E( z/ o
        buf.packet_cout = pshreRAM->packet_cout;' L( _$ S6 w6 k- a/ v% A: J5 p
        / X* S& a1 {% f
        if(buf.packet_cout != count_copy)
& X& B' x9 s4 l        {
( E! K1 L  `8 W( K                printf("a is %d\n", buf.a);9 x3 m- [; _+ j  z" ]5 L3 Q
                printf("b is %d\n", buf.b);
9 H& k9 w; I0 s3 q5 X                printf("count is %d\n", buf.packet_cout);
' f9 X& p7 w, ^) P- t# M$ {                count_copy = buf.packet_cout;) `; b5 [# K. d4 |
        }
( o  v( B9 u, w/ z: W8 L0 R        else; D1 q% P3 Z, b' p: Y& ^
        {( @) P: {1 q; y& [
                printf("No effective message!");
# a  Z6 K3 M" f% o0 E        }
) }8 B9 `6 ~1 w+ W/ c}, S! {$ S/ M$ g5 d0 t
$ O5 Q4 ~0 ]6 ]. E5 i
. w9 a- l  W- I, e: Q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 E" r$ G. z% p% n4 s: w$ L( _
使用下面代码,对内存使用了mmap函数后:
6 x. t$ k# J- M3 C# O#include <stdio.h>
1 ~, x3 ~" \1 B; v: ~* S0 H3 L' I#include <unistd.h>
9 h. ]3 D0 ~8 J" S% L; v0 v" N, _. Y#include <sys/mman.h>. I) I& z& h7 x1 ~2 U8 Y1 V
#include <sys/types.h>( Y, E0 c1 c+ g# s
#include <fcntl.h>
9 q* u' w% O' y  I1 |. Y8 D& z3 i. f  k* r  b( A" V1 {5 x! E0 |
#define SHAER_RAM_BASE_ADDR    (0x80000000)
3 e) h4 d& j: o% g" W3 P4 ]% k#define SHAER_RAM_SIZE         (0x20000)   
' i9 Y/ t; F* E2 D" y5 N% J: t! A/ m, I8 C, e8 T
typedef struct
! i+ ]) {7 m  r{
1 C7 \/ [7 N& g, G6 s        unsigned int a;) ^! \: d9 w2 t% L8 l! b
        unsigned int b;
# |. t# g) S6 O2 q        unsigned int packet_cout;
/ \5 q# N; d, y" B0 V. o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ g& P8 D3 W( e' V

: E* C' c3 n" T& v0 X# fvoid read_MSG_buffer(int *baseaddr);' c6 K6 k( O& f
unsigned int count_copy = 0;$ d: e  U% k7 ?
, O( c& E& w6 ~0 X8 i1 H* g
int main()
9 Z& ?0 v, J3 @6 j0 |# P5 ^; |{- N+ t- }! @1 q* I
        int fd;
$ y6 J9 d# P% w        int *mem = NULL;1 M' W! e! C! u. l2 \

% H* Q/ I, i2 b        if((fd = open("/dev/mem", O_RDWR)) <0)
3 R/ b5 o2 T6 ]# F        {
% g0 w  H& P& k% ~5 l, t                perror("open error");& N- [( k: [% X
                return -1;
" Q0 q0 d. L  c- h% k2 ]        }
1 c0 E5 ]: H$ r2 ?2 C6 Y0 V        " N# ]( K  u8 y$ C/ C
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 A4 Z& w( n4 Y1 r% f, n/ Y. C- W/ S; O; d% B# Q9 U  _
        while(1)
6 X+ k: i! C- D6 p1 E  u! P        {
" T# y/ r" v8 J                read_MSG_buffer(mem);
! f) p5 o4 a4 E        }                8 H! C/ Q% a* a" Y; I% b
}+ `9 A( T# L  x( i# o" A3 V/ n
; j/ S! G2 X  P3 B* D
void read_MSG_buffer(int *baseaddr)8 t8 n4 B" H7 M5 Y
{
! p. I( d9 ]5 B/ x8 W        pRX_MSG_PROTOCOL pshreRAM = NULL;; u3 U4 S. G8 Z" A& b

$ X4 {( b- P3 d7 ~        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ m* R- v7 E' q8 z1 r0 v4 b
; l1 Y6 P7 V: W5 S( H0 ^8 z
        if(pshreRAM->packet_cout != count_copy)) z! m4 y* w0 z$ g# V( F
        {
# Y. z% k) u& d/ D. l0 d5 B                printf("a is %d\n", pshreRAM->a);1 r6 d- S7 `) }; }4 i9 b
                printf("b is %d\n", pshreRAM->b);) O. G! w+ s4 K" ?5 {- Z
                printf("count is %d\n", pshreRAM->packet_cout);5 H8 V# a( \# n. D, q* S: I
                count_copy = pshreRAM->packet_cout;
* O! {" L4 h9 ?& W6 w" u        }
/ [3 a5 p. y0 O/ b+ |# d        else: P0 X, H  \* t9 k
        {) ^) z" A& a1 I  q! P) q' X
                printf("No effective message!\n");
( A2 i) Z: ?0 \2 V, }# C        }
+ W0 [0 t# ^% ]) \8 V& ~! @5 K}
& g$ x: r7 `# p+ w- r2 w
! Q8 d0 W( u- G; L没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& ^" S# G6 H$ |$ z4 B( K
' M- D3 T6 H# m+ w: H: N4 ~0 [8 k
. g5 ~# ?' P2 T3 ]& N

0 k: ]7 I9 h6 r# t" @+ n! V* o! z6 @; _6 L" J; p+ g





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