嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 v* r) j1 s( g: D( U. B4 E
6 t1 E7 D* C& g  F" s* i8 K- t3 g+ aOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>" p" e$ h9 ]( s0 ]: x9 F2 Z6 o0 w
#include <unistd.h>5 o0 V' J, }- M
#include <sys/mman.h>% b" ?3 l: i" u& a( p; A& O, S! d
#include <sys/types.h>
) r- z& `5 F. Y/ `#include <fcntl.h>
8 @# V! k# M  ?7 m) Y9 Z3 m
+ A  S" K% F" b- q0 }6 I#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 B3 S* G7 Y2 D# c( c
4 B2 N0 \1 g5 [( Y* t9 m1 H0 Z' Mtypedef struct
% @" K% B5 F! S1 ?$ o, D( K6 w{
! I6 _( Q$ u9 w$ N/ h9 i/ l* x0 x        unsigned int a;
% X3 Q& @3 w: p) z: s        unsigned int b;) G- _1 W4 ]+ z
        unsigned int packet_cout;
. U5 v# W$ d, h5 f; M}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! j" p9 t6 d& h
- F# t* i1 F0 E) Y8 w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, E4 `1 @( y9 X: u7 i- {unsigned int count_copy = 0;* q$ s" r. P" \! D! J% k$ t

/ P/ C/ f) E' S0 k  r. m3 C1 G8 o* [" ?6 M- N& f8 ?! T$ {
int main()% T! x1 r- `# S/ a* S% h+ d8 l
{
+ i+ v; }1 j8 x* C/ v! w        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 I% u: ^" v" g, {) w* k        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;: \  N; b1 `. d( c* K; [
6 E5 f) s- e& F) ?
        while(1)
0 B6 Y' h. L  k) G  w1 ~8 f        {4 W. G1 n/ W0 k& V2 g! x$ Z
                read_MSG_buffer(pshreRAM);
4 ?" F6 t1 h4 I        }               
: v# m8 @: t8 e$ P' n}0 J3 ^+ \8 Z2 F' ?% P0 p* G

+ a( z/ a$ n" q. P& M6 ]: E/ M2 fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 \+ K' z# P# n8 {) a, ~
{
0 q8 }  K; J" G4 d. N3 y# w, f        RX_MSG_PROTOCOL buf;
! |2 d& p( T! T8 X4 U0 F- ~        & j* I( j- g! T2 f4 {$ @# a) L
        buf.a = pshreRAM->a;3 [, J1 v' t/ z; C" O3 ]
        buf.b = pshreRAM->b;
8 f/ c4 |+ C+ d7 e$ ^4 O        buf.packet_cout = pshreRAM->packet_cout;% `+ q+ b- `) g' o' x# A! P
        * }  u! Y  u9 f6 `
        if(buf.packet_cout != count_copy)& a4 [8 x, `) p2 h
        {
; Y6 A+ V3 s7 j( o                printf("a is %d\n", buf.a);$ w4 T! E' |# h* E( m, U7 Q! `9 B
                printf("b is %d\n", buf.b);5 q& p+ X+ g9 q% d8 o. {
                printf("count is %d\n", buf.packet_cout);2 ^6 j9 v& W- z/ M: v
                count_copy = buf.packet_cout;
8 I1 U+ d* V! I" D        }2 o# u0 Z- |: h9 A* k8 R  \
        else. M: b! B3 R4 G: ^; z9 S
        {$ t! x" Z4 d0 e# R" A" q1 t, [
                printf("No effective message!");
, _6 H4 {& }' Z4 h! X  g9 U3 X        }
% ~( b9 Z$ {7 A- M0 H' A* b}- F% c( O) g9 b

* X" w$ r8 z1 H* B1 [' E( g
4 s4 w9 d- H9 w8 |3 C' L但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% n' [$ k2 @: r0 ^: e# e. n2 |
使用下面代码,对内存使用了mmap函数后:5 S( R( ]1 ]. I
#include <stdio.h>
5 ?/ m1 C, I2 W. @#include <unistd.h>
  ?0 T; r4 i+ L" J#include <sys/mman.h>
5 m4 Y5 G; }, H0 r2 Z& a#include <sys/types.h>" K& e) x" B; e; W
#include <fcntl.h>. f! k9 t+ V4 K
* ?% c5 U% s4 Z3 B
#define SHAER_RAM_BASE_ADDR    (0x80000000)$ }, F2 o8 y! t
#define SHAER_RAM_SIZE         (0x20000)   + C2 Q# ^" e+ I2 w: `/ |

  V& V% ~. J0 }1 @& l2 s# Ztypedef struct
) ?6 b6 P& o, n) P: w; r{0 n1 V0 q. t; d* V
        unsigned int a;0 u  x3 H* D0 j. V. @4 I
        unsigned int b;9 x$ n- h$ ~0 ?+ [' o' r
        unsigned int packet_cout;2 p( F0 e9 T3 V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 `! @4 k# p9 ~& e; h( a, }
6 L8 z/ b% F% J5 G" N+ x- [5 Yvoid read_MSG_buffer(int *baseaddr);
6 p- L4 v( L! d3 c# a! X2 bunsigned int count_copy = 0;" ?* Z+ x: h: B7 l$ G0 w- y3 i
0 O+ r8 C' v7 J( m) U) [
int main()
7 s  S2 J( N- n4 e# L{% a( B( {5 M5 j# e
        int fd;% E) _3 W. g. e) W5 k
        int *mem = NULL;7 {% t! K) O" r& n9 d, Y& f
3 U0 d* E& U5 I
        if((fd = open("/dev/mem", O_RDWR)) <0), a4 z8 v  M$ X2 ~/ H$ L
        {+ [7 @7 D; {) H2 E
                perror("open error");
) C% h4 U9 j2 l                return -1;
8 Z/ m' ]% w0 Z+ m* Z5 W: A        }
0 |, Y5 r+ d- O& l        
2 X- y3 z/ q8 E, t4 w        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- G+ m" V( H! L, H9 W

4 U$ e# ?3 m0 {, Q& ]) o, h1 \        while(1)
/ X( Q) ~! C5 A4 Y/ w& E; `. R        {
8 s2 z& ?4 N2 Y: U& H                read_MSG_buffer(mem);! U& j' p' z1 K0 |
        }               
7 p) h9 \4 i$ M9 u" \8 @: }}
* }1 @$ L+ a" L/ T# L* t+ ]
& l7 U3 [4 [- ]7 y& y3 B. k! I! uvoid read_MSG_buffer(int *baseaddr)( i* B' g2 H, b4 A
{
' m7 s7 S- t7 t1 e        pRX_MSG_PROTOCOL pshreRAM = NULL;$ L; r; N' F0 o  E( [
( T% I# V) b2 [' x% u: Q; @
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 C) w) Z; h3 ?% h6 d  g4 U# u5 h: A
        if(pshreRAM->packet_cout != count_copy)' T* {7 x/ w" O- D# C, N" z+ e
        {# S) s; `% Z8 q
                printf("a is %d\n", pshreRAM->a);
& o5 p/ h2 _* y+ T$ v6 G5 s; f: w- g                printf("b is %d\n", pshreRAM->b);9 \, [. `& J' j2 C- ]+ q& ^
                printf("count is %d\n", pshreRAM->packet_cout);# z" [6 M; r" D& K1 s
                count_copy = pshreRAM->packet_cout;' D% t# V9 {+ s9 a+ d1 B. g
        }7 q/ t* g1 ^7 w8 u8 T
        else
. s2 c. c5 R4 g- D5 w; @        {
1 I, ~. ], l; g. [6 M- A" B) b; Q                printf("No effective message!\n");
) e6 m) H* ?1 b$ X- z9 B        }3 Z( l! R8 B0 X& u
}7 [$ y/ z  N1 {2 A" U

4 n1 v% i! B& H2 o" R; U4 M; Z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 B: U$ R1 o- e) f9 F; h, L3 F$ c
& K# P0 t& V9 D* a) h/ X: Y
) r( w) G# F& @' @7 I6 Q
. B* m7 O: @3 ]" h" d" W

* z! c( f- {' C# I) ~




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