嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : i  }. [  B" a/ C5 s7 x8 p8 r

! G; r; l  ^" \% N5 C; Y0 t) c( F" QOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: M) t% ]2 o/ h" r. Y#include <unistd.h>
2 f, e; G& `6 k$ x# ]( v' y, ?#include <sys/mman.h>% ^" \- l" x3 A* K
#include <sys/types.h>
( Q6 z* N# d! x+ c#include <fcntl.h>" Z$ }7 b+ F2 O
: h  r+ F* Y7 s
#define SHAER_RAM_BASE_ADDR    (0x80000000)   * V9 t9 ]4 R+ G) U* Z' u7 F

, U1 m. t$ J, Etypedef struct
- ~" }# p3 I# c7 }, I{
! a2 e5 J5 C. B% z/ Q        unsigned int a;
+ c1 t+ d2 O$ w7 g/ Y        unsigned int b;
1 k  Z# u& h: N2 D" s: L        unsigned int packet_cout;9 u+ J) t" C( V& x3 O2 l2 J9 D+ ^! @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# f+ j3 v' a) x1 D: ^

- `2 I; ?& ]/ q* E, h% Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 y3 r) Q" O4 ~  g0 M& P8 ]# junsigned int count_copy = 0;; S/ x& O+ d3 n3 Z) q

. p  w. Q3 I) v
9 X& j$ i/ {+ ^( d* Bint main(); D% S5 f" k& o: ~9 O) p
{( n- j. F5 H) `4 M7 }" R
        pRX_MSG_PROTOCOL pshreRAM = NULL;
- k7 {9 w$ i) {$ F8 J        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! t1 M2 P/ O9 X  T1 [; ?8 w
. B' g4 e/ @$ [2 u- f  ^2 `- o  L7 u
        while(1)3 w2 R, z7 ~( k
        {' Y  w% Z6 P) o- b
                read_MSG_buffer(pshreRAM);1 q/ @/ Y6 [9 Z
        }               
+ B- K, J3 u; @4 y}( K- e# G7 }6 K6 E; `9 M/ h- H
  i. t; f  Z" s3 L5 k( N$ w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 N  j( v) v- V3 o" }
{) w; P5 W, j3 T
        RX_MSG_PROTOCOL buf;4 E9 ^* Y( A0 ]7 Y" D
        6 D5 h- G7 W8 h1 ?+ m
        buf.a = pshreRAM->a;% s) U3 r$ I- H  O4 P0 e
        buf.b = pshreRAM->b;3 D% G0 p% a2 b: W# C
        buf.packet_cout = pshreRAM->packet_cout;) X8 \) q% Y7 S
        
: \! g) C/ s; B0 o3 ^0 c' U: L        if(buf.packet_cout != count_copy)
# }8 p: S% j( m& L/ A        {1 H; @1 I) k" G' O/ r5 _1 S" @" F
                printf("a is %d\n", buf.a);! r( p& k3 [$ p4 v& C  _& Q' R
                printf("b is %d\n", buf.b);
  d1 \8 P  t2 p) I- _                printf("count is %d\n", buf.packet_cout);5 Z9 X6 Y( D* S4 w+ s
                count_copy = buf.packet_cout;! O$ G3 a$ p7 ~, w0 t* y8 F
        }
* n1 z4 u& P& c! L! l1 M$ `        else. x3 z9 ^9 q! |
        {/ q, E' o/ o1 Q% T1 H' B( C9 L/ G
                printf("No effective message!");" L8 a  F) X. L
        }
( V4 ]$ |) m2 w}
" O! F9 J; k. w" G& T8 l5 {" e: [6 y0 l8 U: x

. e- [, }  a) a7 H; T但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# r4 C2 p5 A- M2 E8 N5 g
使用下面代码,对内存使用了mmap函数后:
& n# _, v& D* d$ _* b#include <stdio.h>( B* M5 q/ O1 j9 c5 @6 M* p
#include <unistd.h>( E# D0 N# j; Q5 C- \; ?
#include <sys/mman.h>0 [5 s$ ]( `, l0 R5 k: u2 t
#include <sys/types.h>
6 q+ `: o9 c8 J, k! d: d#include <fcntl.h>0 x  p# ~" X( U

5 S9 J, ]* z8 q3 T#define SHAER_RAM_BASE_ADDR    (0x80000000)3 z2 C2 S( T6 q/ K5 X( M8 j4 u/ W
#define SHAER_RAM_SIZE         (0x20000)   # @& \( d  X1 `7 \

+ Q- G* \% |1 N0 J, Z, `- }( jtypedef struct
- }# }( Y" N1 f7 n! D0 [9 K6 R{
% _: E  P/ C- J: N& H        unsigned int a;2 N8 _! z- ~" ?7 z6 A- }: v
        unsigned int b;4 m; p) O2 {6 B1 ]. i+ \  X8 m
        unsigned int packet_cout;
8 C. r. W/ K) ^* c$ L" J}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( z8 b  M: q$ x; p9 c7 X: B
  U7 H0 C/ y' b& [! {3 w7 f
void read_MSG_buffer(int *baseaddr);( h, e6 @% E3 C+ J5 }- [: }1 M
unsigned int count_copy = 0;
, u* {4 i- t9 E5 A& Z" {0 B  B8 O) y4 m+ `% V: F" G
int main()7 D6 |' {! r1 R0 f7 i, F# c, s
{
: N0 k7 k2 ^& B9 V7 C) h$ {1 T5 f; e" x        int fd;/ z: q! P4 G% \* V5 O# j7 {  T
        int *mem = NULL;
6 d: K* }# z. B& X# o. d+ w9 _$ f" h) {! v/ ~
        if((fd = open("/dev/mem", O_RDWR)) <0)+ G! [2 R; x9 N2 T& U; U4 f* f
        {
3 |6 b+ ^, N$ i2 O: {* g                perror("open error");, W; e6 @: b: A, @
                return -1;# x( o+ a9 w; b" J8 G
        }& f! f4 V* u0 I0 @8 ^, q7 h
        & c) f; O, G2 b. b: K2 _! `: M
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 w  D" H& b: R  b
0 E9 |1 o- m+ c4 a+ L8 c4 D
        while(1)/ h' S. P3 g" V# W$ {: @
        {
9 U4 C. N7 I& k6 q                read_MSG_buffer(mem);
) y3 T2 L" [, ?/ m* ^$ h6 e        }                7 S# w  ^* Y3 w
}
' }( N: s4 ]- l6 S
1 {4 k8 g! G: s& X2 @void read_MSG_buffer(int *baseaddr)
* k  M6 G; u5 ]7 G0 A. \) ?+ d2 t{" K8 o, g' Z: k$ c
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' P- c2 \+ D& {" k- V  t, R( i# T6 ]& M" M
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( k: u- J# f; |0 z: X% q8 r) d: _! X) ^/ @' V
        if(pshreRAM->packet_cout != count_copy)( x, Y' K* |! l" w% K# H
        {& j' J% f: Q3 a* [
                printf("a is %d\n", pshreRAM->a);
2 h. q5 J5 Z6 F* g                printf("b is %d\n", pshreRAM->b);
4 E, i/ F8 q" z9 M: b: V9 s$ i1 _                printf("count is %d\n", pshreRAM->packet_cout);% B5 |4 G' H  l1 L7 n5 k! @% T
                count_copy = pshreRAM->packet_cout;3 V+ Z) Q9 ~+ i- {) ^$ z- l) I
        }" V7 G& v* z2 g  Y9 g6 g5 a' h! b& |
        else
9 C& \  N0 j; c$ M+ U* x& v        {
$ [6 W; _* ~& D( T" W                printf("No effective message!\n");
$ d# s+ X" a) v! I9 i        }; g$ b: p! W, u3 E: v5 Z
}
3 ?; _8 R3 K3 l8 K9 X* e8 J5 g  q8 q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 D3 j( b. r+ A9 o9 K4 I3 Z
4 |" N# ?9 m: l, }5 _; ]' n, ~9 I

6 t, E+ T- e6 h: A, h- `' f# t; E% g: Z: K7 H

  F6 b" J! R: ]1 Z6 K




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