嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* A7 O% D. c' j& ?* t( a1 z7 i' V2 p: W- U2 X1 Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h># }4 `* w  ^; S7 Y5 W' u
#include <unistd.h>  L) ~7 R9 R# ^9 V7 ?. D# C
#include <sys/mman.h>
" R! ~& Q; ~& D#include <sys/types.h>  p: J+ M5 I' L3 A
#include <fcntl.h>
1 i2 j* e( b) Y+ |4 k
6 @- D$ U, I6 G3 R. U#define SHAER_RAM_BASE_ADDR    (0x80000000)     e7 ~, [1 R+ g

9 e3 v+ E3 Y5 q1 H1 d6 stypedef struct
9 F5 U+ q/ Q& `1 u0 L& W! J* s# m2 m{- u% s$ V9 B8 m- V, d  d
        unsigned int a;. f5 T, q5 a8 t- S& G8 z8 q( q/ u; c
        unsigned int b;
: |0 c( y' V: G" s. g9 h2 s, l        unsigned int packet_cout;
) J& w/ u7 Q; {3 {- q  o. t1 \3 O) L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" L/ k7 U( N1 [7 K0 E9 ?. P+ Y4 u
( L; L, A& W5 s6 c2 x0 p) s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);! ~0 W: k4 ~  `; c( s2 Z
unsigned int count_copy = 0;
7 Z3 d. \4 Q' u% i9 ]. F
# X; T/ x8 V8 J9 y- |# ?) o  F" z- I) \* @
int main()# Q8 Q3 e  S8 D: h* E1 B  a
{6 i) f  S7 J( L/ {. t' G; u
        pRX_MSG_PROTOCOL pshreRAM = NULL;7 c. G8 t; c5 G. L0 p, X8 e6 t' ]: @
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% A! |2 |3 B  F  G
1 R. d! i, W7 y- @        while(1)
: V! \: m0 o8 I- t' R* N# L# {/ O        {
  @+ a- m1 \1 p5 w                read_MSG_buffer(pshreRAM);6 H2 j: y7 O4 B. I. L# ^( h; ]$ x$ o' R
        }                : Q$ w9 l. S. s0 [/ O
}/ c8 W* v$ r6 h) L

3 f# V- |2 M. H: c" S5 l" y$ [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ J5 ~& `  G2 l5 S4 R8 t{3 C* X/ D0 j# [/ n$ a: q8 m5 A
        RX_MSG_PROTOCOL buf;6 e9 i# }! n+ Q8 h; U0 \+ X- {
        , r  R7 ?, c/ P# k% r3 h: r9 E) j
        buf.a = pshreRAM->a;
% N) a- u8 ^9 J$ c6 u1 G        buf.b = pshreRAM->b;
+ W7 g' {# i* y, Q        buf.packet_cout = pshreRAM->packet_cout;
) k* D7 ^9 p" g9 J        ; h/ N. O5 F& s
        if(buf.packet_cout != count_copy)) P0 j8 D0 i6 \6 z/ T+ i' n6 @
        {! t, M6 `" ]" ]
                printf("a is %d\n", buf.a);
# i4 R0 e1 p( Y0 o0 i                printf("b is %d\n", buf.b);  X1 z' Q6 P0 }1 C. L
                printf("count is %d\n", buf.packet_cout);5 U* ~, h/ X, p- M- e
                count_copy = buf.packet_cout;! m' E% ?3 _/ z& g
        }" I2 H5 _! P6 q- Z
        else
& S# e! k: f" b8 I# {5 X- n        {* n5 A6 B* Y2 h6 d/ \
                printf("No effective message!");
: ]) b: d  E5 @1 p9 Q8 g2 E        }" a6 \+ m+ N6 Y7 F3 [
}7 u, |; ?- Z1 }! C0 Q4 @

/ T1 n6 `% m6 K1 i2 l( _. d( Z: [# k% ^# r  w* X- Y9 \% W& r
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" N5 g& D! z: {. W4 c! G2 Y7 I使用下面代码,对内存使用了mmap函数后:
! T; A' \% J( w9 o& ?#include <stdio.h>
. |( F& e) W6 T#include <unistd.h>
6 N2 @( b0 J: K. z4 x" z$ N1 j#include <sys/mman.h>
8 `. q' n; Z, X5 V9 P. v- K#include <sys/types.h>. L: @' E" s; r
#include <fcntl.h>
' Y9 O  r  h* s, Q- M
7 n- ?: j- i6 B5 m# s; D#define SHAER_RAM_BASE_ADDR    (0x80000000)$ Y3 @+ ~4 ]( y
#define SHAER_RAM_SIZE         (0x20000)   # f8 C$ x2 V) Q/ Z

, G& ]# H' t! z. ptypedef struct9 q* n  H) l! Z# s" e6 F
{) }" g9 A/ V. v; l! t) B. H
        unsigned int a;2 j( u& I* f4 G& B2 H$ C7 Q; N5 f
        unsigned int b;
+ X. r, h5 t8 w* m% q        unsigned int packet_cout;/ B  k0 y: c# O# z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) L) X7 s! [8 O* s" M, m

$ ^# t# B! w. V: u3 y' F$ Bvoid read_MSG_buffer(int *baseaddr);( P3 A  t" k0 E$ k( u
unsigned int count_copy = 0;
* a  M) A) Z5 k4 [8 _" Y
6 J" v8 O' D& S5 B+ gint main(). _! |. @- C: H. ?& O  R; J
{
) w3 q9 E, u0 d+ g2 T        int fd;
9 e, |3 X+ o  J  z0 s        int *mem = NULL;+ b  f1 V! ]. @7 `) A6 v
$ A6 X. C9 p5 S2 S6 F$ a
        if((fd = open("/dev/mem", O_RDWR)) <0)) I! ?; F$ b+ T; `* z
        {
# m) P2 F$ z3 [) h                perror("open error");8 g  J! b1 @) y* C# u  Z9 |1 _
                return -1;$ \  q8 w# k3 J: G! y4 B/ n: p
        }
. h! P8 w. t1 j+ I) W9 o        . F7 Q9 }* K3 ~% p, {' f6 M! f
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 d1 Y1 [3 [. D; s" J2 C. _! y) R# v  |" n+ k% h$ B" \' U) Q
        while(1)3 m, U' p1 z& V. O1 t- V& ]! T
        {4 z: \8 ?  G9 G. H2 p9 d7 T
                read_MSG_buffer(mem);: t7 O% t; k. }: ~$ A. X- b; ?% Y, K
        }                5 P  y/ \/ @" T7 I
}& u% [' A/ f& c" y7 L

5 P8 P+ z: p1 Avoid read_MSG_buffer(int *baseaddr)
/ R5 m. ]8 A# R1 X; t7 x{
" R# N( ^: @1 x0 m: [# e        pRX_MSG_PROTOCOL pshreRAM = NULL;
& Q; ?5 X  t" z: @4 _" k2 w3 O# `
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ d1 q% ^$ v& P- s$ ?+ ^3 }4 }

& M- f+ r: B# J3 o- N0 h2 v% z7 _        if(pshreRAM->packet_cout != count_copy)' x+ W+ J) g& k+ x0 H1 q& n+ M& g/ q( I) B
        {
. N& U2 J& C: ~                printf("a is %d\n", pshreRAM->a);
! a2 y$ R9 ]9 S                printf("b is %d\n", pshreRAM->b);: e# M6 L1 o+ M7 X* T
                printf("count is %d\n", pshreRAM->packet_cout);
- W9 M1 r/ g* y+ [* y                count_copy = pshreRAM->packet_cout;5 r, i* t" q  M/ V) \) i. z
        }
% M/ i! \2 s  i        else
+ Q; L3 p/ N; \! v5 s9 }' Y% y        {
/ Y$ ?4 \6 V: m% j7 W                printf("No effective message!\n");
1 y, d2 n! s+ ~* h7 x9 h0 B3 P        }
6 \3 A! ~' r5 W2 u9 y1 [/ \+ L}
4 `& F6 G; ]. R/ p4 x
; |* R( [" G- Q( T4 Y; A+ p2 b+ u没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 P( q6 ~& G7 A7 q  q8 o: s
' Z$ o$ B' o7 O+ J! m) C: U1 i
! j- L8 l) L/ [! h" g* N, D# f& m- @7 u& r) t
: c/ i, M# W7 [/ v





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