嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ q" f$ E- ^+ w% h
0 L) e; X( h9 L3 e; j
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# D3 m# [3 h- @2 M( _#include <unistd.h>
9 v1 r! P1 R$ `#include <sys/mman.h>
8 m0 D' {$ j4 _' w; z#include <sys/types.h>
2 |4 G* D  D3 M1 P, @#include <fcntl.h>, y6 e  ?4 f8 b/ M  h% r

: l( q9 O0 \5 }/ o2 x4 M#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! P; F  K' N; g, U

' y4 p+ u& E9 \7 R* N( [  ptypedef struct' c3 X- ]1 Q8 D2 W. x
{
+ x7 \- h: c' l6 q        unsigned int a;
( u* c$ \# m0 B  p/ p: W; _" ]4 \% p        unsigned int b;& r" I+ z( G1 u, E
        unsigned int packet_cout;  l" u7 _1 L' z! q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 r: L7 j, b# X# e6 V3 j# S

8 B9 J: S2 I  Fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 X  A" n& B/ p; C' i! p
unsigned int count_copy = 0;0 a" h% x+ k  ?% g
  X- W  o3 j2 z) l+ d1 \4 X& |

, Z7 `3 H% i' O: S0 a% P% ]int main()
$ k( j6 K# q! E2 Y) @{
- k; `, f0 M$ L0 J' [( L4 w' c5 r        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 ]- l1 s2 t* L. N3 X        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( r( F$ h' W7 W; g* g# a
* T+ M( p0 G: c% C4 I1 ?: g        while(1)2 P7 x! O, t- z6 E0 B5 d, m
        {
! ]* Y! Q+ e8 N                read_MSG_buffer(pshreRAM);
$ k" c: s2 G) I9 J" c        }               
0 B3 W2 A0 J. y7 o$ }) L+ B$ T}
6 }% p: o3 S  a  X5 G  R8 r; _
/ B; U8 B% o8 l& R- h2 wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* R! X1 y# m& L8 e! h  h
{2 N9 W$ K: H, Y/ z
        RX_MSG_PROTOCOL buf;
/ o8 v- ]- e+ F) i2 L! A# h        
* f  c2 j3 T1 k7 `, g        buf.a = pshreRAM->a;  \- Z3 h$ g- d8 ~+ U1 O, ~3 o9 R
        buf.b = pshreRAM->b;0 B0 K. r- B. k5 I& L9 h- ^% q
        buf.packet_cout = pshreRAM->packet_cout;
( ]/ Z: X. _  Y, F% ]        
4 `7 U8 J" G: o7 K) S6 c9 m        if(buf.packet_cout != count_copy)
2 `; u+ [# I2 R5 `- Z        {
8 M/ L4 H6 X' N* D5 Q                printf("a is %d\n", buf.a);
3 x/ f3 Z( D* k  I8 J                printf("b is %d\n", buf.b);
: {5 l. Q$ ]' u$ [( ^. p: f- Z                printf("count is %d\n", buf.packet_cout);: v$ I$ {% v  c/ {! ~9 V! h4 J0 V
                count_copy = buf.packet_cout;
1 `% j2 n) i) z# V) N! e8 z        }
" _& t1 [9 i/ l" O9 }# p        else; u) J: d  L5 _- s" I$ y) g% o
        {. [1 k7 j, r: O6 D1 i  t
                printf("No effective message!");* W4 I* n7 }+ m3 J  x
        }
% V- L  g5 F# R8 D, t9 S}% A1 j! |" u+ ~1 e# n3 e* S1 Z

; J/ |) V- _: H9 D9 J" \( Z6 s' R$ ~' y- c& E! ?1 y; I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 o1 D. Q% S9 s" C+ \) G, }使用下面代码,对内存使用了mmap函数后:
, E3 H, [( q( I& I! H) ?#include <stdio.h>- ]$ n6 c7 C" o8 u
#include <unistd.h>
  \8 h7 x% s- v& z#include <sys/mman.h>" I( f+ t% P" q6 c3 h$ F
#include <sys/types.h>/ m; d7 B+ B" m5 E) i' N" Z
#include <fcntl.h>
2 D5 c1 }" H) T5 ~' t7 X) n( {5 w' m' Q+ C5 k5 O  A3 A
#define SHAER_RAM_BASE_ADDR    (0x80000000)# J$ ?5 V1 _1 g
#define SHAER_RAM_SIZE         (0x20000)   
& C" ]$ Y; G; `! u1 v: p+ H
6 j1 X1 B% E/ \' S7 E7 Gtypedef struct
- s5 R2 g: B7 G6 n* ]1 G& B& T" T# T{
- K+ j+ M" N5 O" e4 E) ~        unsigned int a;4 M9 n: o$ a) d9 F9 V6 [( N" H
        unsigned int b;
) Z1 B4 \1 m7 L4 P6 c7 b4 @        unsigned int packet_cout;# Z6 w; I8 ]" X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 ~4 P/ c8 l* c/ }. w9 I8 h1 O  b8 h9 w8 X/ o" y
void read_MSG_buffer(int *baseaddr);- }# T, h, \& x# [
unsigned int count_copy = 0;
, P* b# ^9 w; O: Q; k6 b8 h
9 y/ D$ s7 L6 a; w2 z: \int main()# i0 H3 \! T  i5 @
{
- v* B7 D# G7 g- d9 i, h1 w# t( z        int fd;
& I. K$ S1 u$ x0 w" w) j) `        int *mem = NULL;
% Z3 h3 ^) H. ?: L+ L& O5 m! @7 L+ a: L) F' j
        if((fd = open("/dev/mem", O_RDWR)) <0)# m& S; ]( _: H4 d0 v; [
        {- |5 \8 `, s- O2 m2 ]
                perror("open error");0 x  A3 L! z. {4 Y4 Y
                return -1;
0 ]7 K% m9 ~( C) v5 ~8 R        }9 v$ h4 K% @0 ^
        $ G; ^( B+ t! @" I
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 f6 J( Y1 ~. \6 o$ k0 m. R+ C
$ H$ k  X4 A4 d( F        while(1)
* m4 Z4 y6 R7 }7 M) D        {
/ F; z, }, a8 \- ]: ~                read_MSG_buffer(mem);
5 {5 M- t" Z& v4 M9 W        }               
5 u7 z* X# ?. q+ Y' g5 H3 V}
8 A- K2 @3 [! `/ g/ Y" U) C' E+ _
void read_MSG_buffer(int *baseaddr)
6 J+ K4 c7 [8 y$ y{
/ c6 |& K1 z5 r- w2 N% k        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ |  f* G0 b/ [8 B: a: D
: ~1 N$ L9 [7 c" J6 H7 B4 X        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! o) A- I. Y( B; Y
: Y. e, w0 c+ d& a7 L3 u7 _4 e        if(pshreRAM->packet_cout != count_copy)6 x- K+ s1 n2 L7 h
        {7 E  o, a, i; K
                printf("a is %d\n", pshreRAM->a);
# C, k* Q7 ]! Q, I6 |% E                printf("b is %d\n", pshreRAM->b);
  a$ G9 O  l' p& K* P0 R9 M                printf("count is %d\n", pshreRAM->packet_cout);/ m; B$ i' r9 k% b' n( P! @  f- f
                count_copy = pshreRAM->packet_cout;: L9 F0 Q  F$ v/ D
        }1 g+ p) h, P! n5 s! {% T$ ^0 u9 @
        else
- V( H1 |: t. a! X. H- M' w        {- y6 R6 m, B! [1 B" |# M4 W
                printf("No effective message!\n");
$ Z+ R/ b- F/ U+ H/ N        }
& G5 H* k- N' f0 d" ]# P6 e1 h}) |8 U2 g' B5 F$ Y9 `! R
; _7 P+ B# M5 R0 Y# d/ ~
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. U8 ~; Z6 C5 ^5 U: J( x

8 P3 }6 O% b1 [+ U/ `+ T: Q% E( C1 m( [, G" [: H

; l# d/ p& n& R" Z% t2 b# l! X/ {- O/ Q6 |





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