嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ y/ i- H7 q; X* F8 L, D6 v4 ?/ t# b+ B6 i: r. Q# h
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, @0 ]+ |) @- `/ `1 X$ i& I#include <unistd.h>
1 {8 C! r* V1 N#include <sys/mman.h>
$ Q5 i' X: M! C: X/ r8 ?* Q. n4 F#include <sys/types.h>1 P/ F6 b' u/ K: b  N, F
#include <fcntl.h>9 N# K8 z) G. g7 C5 D, Q: J- |
: N0 y3 \- I8 s& ]# t* H
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) Y" W8 {  f8 }0 O$ t1 T8 S- @5 p+ {' J6 L: {  C: O% k7 C6 h# c1 M3 E9 I
typedef struct
: c% `( a# A! a6 @3 W2 F{
+ [' L6 i* O4 D* S3 u0 m5 _        unsigned int a;" r  R+ s9 I2 _! Q2 \, \9 S
        unsigned int b;6 M$ U7 F- `0 Y8 J0 X: @
        unsigned int packet_cout;. h4 i# c' B3 n6 L6 Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ @; _; m9 x- t6 y; t$ l. D
" q/ c& u6 L5 [: [6 a5 z+ }void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" t- z  I1 L# y& D
unsigned int count_copy = 0;! b0 z3 y! m' k% P' j" d; Q$ S
% L$ v* ^0 A; u# Z9 V" {

' \! X& S" s+ Q5 _int main()9 |9 f2 o( `6 F: ~- p$ |7 `  a
{
: i% e% w; v7 m        pRX_MSG_PROTOCOL pshreRAM = NULL;
& W9 k8 g+ F7 O1 @# R7 z9 X6 S        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 T# n  Q, Y8 y" x6 `6 u5 M* d2 S

) V/ a/ d; G0 h/ v        while(1)6 e- H8 G- f7 j/ a% J" z
        {
$ s0 d  A. ~* x- r% A5 W* k$ y                read_MSG_buffer(pshreRAM);$ L6 @7 k0 P1 [" e# b* ]" J! ?
        }                % r2 K" t7 q* c5 c
}
. U0 L3 B/ Y6 O4 B! ]  v, q5 ~
. }2 n# b3 d$ g/ v" U$ z) wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ c( y# D5 I  ?  F, ^
{8 {8 D/ x& [' t( t3 G( y( B& ~
        RX_MSG_PROTOCOL buf;9 s! d3 j; \6 }1 V# Q: s
        9 r8 v- j+ Y# v7 m: G
        buf.a = pshreRAM->a;
3 u8 Q: Y4 j. u: _; H" p# K9 ^        buf.b = pshreRAM->b;
+ B1 T" h4 d2 [        buf.packet_cout = pshreRAM->packet_cout;
# d* B6 i* h4 X" S/ N( ?/ ?: u        
: U& m8 Y, t  C1 l" x        if(buf.packet_cout != count_copy): Z9 `( U% K/ w
        {
" \1 S4 S7 \4 A4 e  L, n: a% M                printf("a is %d\n", buf.a);( k% t# ?& v: [9 T" I
                printf("b is %d\n", buf.b);6 K6 @: l/ S1 q; u  m" U. Q
                printf("count is %d\n", buf.packet_cout);
4 O4 o" }' Z  {; |                count_copy = buf.packet_cout;' w: d: \: ?. S5 l8 e0 [
        }
3 d  ~8 J3 a7 H' ]+ j; J9 Y6 U" K        else
$ k7 _6 P% ^" \" d) l+ y! R8 v, ?        {
2 y5 |. b" p0 o+ E- V                printf("No effective message!");
/ f( z% o' l7 D* J        }
9 K( ?' X: Z: O+ T& A6 c) e: h}
# B$ E3 G. f) p4 W- v, E- H0 G+ c2 K9 e( ^4 R+ h

9 [2 |- [( K  C2 y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, K' [! q7 T5 J3 d
使用下面代码,对内存使用了mmap函数后:6 [' t; Y; V5 ~8 p
#include <stdio.h>- }$ h/ ^6 T) s4 k; s" B  L
#include <unistd.h>6 X1 Z3 d" _$ o
#include <sys/mman.h>4 ?1 m0 G9 b3 N
#include <sys/types.h>, M/ V$ ?  r: O+ s6 v
#include <fcntl.h>' l2 j: y$ _% U

  W* @+ ?; H! i' S7 E#define SHAER_RAM_BASE_ADDR    (0x80000000)6 r# W* R- h" X' a
#define SHAER_RAM_SIZE         (0x20000)   $ H" c7 ?5 r  G7 x3 d5 o$ h

& d3 T( H) ^$ U9 i) u' d7 X3 \( ^  y6 utypedef struct# X1 m4 D7 n7 R/ C5 F6 D6 Q" H
{* e  {% J, g) _, t
        unsigned int a;
9 d9 z5 L* a4 @: O7 j# j        unsigned int b;
' R% I+ ~. n- a7 b5 a/ R0 B        unsigned int packet_cout;% h: l7 \( N; D+ Y# j7 d' n. B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 }. h! i! {1 @" V' S
5 P, o! }! P" n6 I2 \- T. H4 M( ], ]void read_MSG_buffer(int *baseaddr);8 I8 O6 h  E2 K' b* [7 `) x. y
unsigned int count_copy = 0;
3 q9 k8 l  B( ]8 g0 l/ v: X, N4 |1 e7 P, P& H  l& f
int main()9 [0 p9 Y( [) n+ q
{
/ \( }. W" D! J; z; D' o+ O; ^$ M        int fd;/ y8 ^' C9 z; x8 }; a+ v* ^
        int *mem = NULL;
( |& h( ^" e6 w- H& c$ j
  r# y: k+ Z8 |, U* E$ _9 i  U        if((fd = open("/dev/mem", O_RDWR)) <0)
8 D, e; F/ V, r- W2 x- U, e( D        {
) c; ~- T; y6 l                perror("open error");2 _0 C$ G; M9 R( Z9 K9 I4 i
                return -1;
7 J' \$ j2 p6 e        }
3 B" x5 _7 q9 T8 W* q4 e        : n# \2 Z0 F, G5 T$ [9 c$ i4 j+ ]
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, _/ W0 [8 t) `: |9 ~, v

2 `+ J1 `' @: r7 L* |3 p$ p& ]. W        while(1)
. u% r% R* x. c$ x; Q        {- r# @' {; u, M6 A3 D  W, }
                read_MSG_buffer(mem);
. I- _! R' ^# ^  w        }                8 C) w' d- Q! @1 U
}+ o5 k. C$ g1 s5 S
1 Z) w3 e# w: V+ l, t% x
void read_MSG_buffer(int *baseaddr)
: F4 s3 N* b" D# X{
4 R; N% H. S6 U( O) k, M+ @2 {        pRX_MSG_PROTOCOL pshreRAM = NULL;
. L, }4 B7 F) @* x. \0 _
, g" Q8 A& {& U2 i        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- j6 b0 J7 T, p4 x- Q
2 L0 o9 v' e- c9 }
        if(pshreRAM->packet_cout != count_copy)
7 z! R4 _) ?: B  R3 I" c        {# h6 n6 B& F5 E0 F6 B) q
                printf("a is %d\n", pshreRAM->a);7 a. [: g1 k, C; K( x2 ]
                printf("b is %d\n", pshreRAM->b);# H9 f; t& ^& T+ O
                printf("count is %d\n", pshreRAM->packet_cout);  R" A: j* [1 j
                count_copy = pshreRAM->packet_cout;  `8 I- Q  E. H" @2 _/ n
        }
& O$ ?5 P, o/ L& E8 ]% H        else
4 P# V# ]( t$ l: M7 X5 S        {" G4 ?5 U' l4 \; o7 |$ [- o
                printf("No effective message!\n");0 i! \! I8 K/ T
        }* }9 Q1 R: I- F* p$ G3 K( R
}  H# A$ W, ]  v- @/ M& g
) y7 ?: g' p9 ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" o  b# q! g( _: e  Y# Y% P1 h: g6 t0 [: a1 l$ Y* t

" J; w  \- D. f% s; S. B4 h$ T5 g( X4 E1 I3 r8 q, j
& q8 ?. N2 n! H: F: Q7 e7 \





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