嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& Z: o* _' [8 C  v( |$ D4 ~0 E) E7 S
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- y& g# r* w+ }* R- T$ h
#include <unistd.h>
& c: _- B% L3 @3 j" v. @#include <sys/mman.h>1 A" i0 K5 m. d. `) p+ n
#include <sys/types.h>
6 a- q) n# P& I  r  V#include <fcntl.h>8 `& f: A2 E( q; |5 F

( f* T0 E' U) R- O( H- v* `#define SHAER_RAM_BASE_ADDR    (0x80000000)   
/ B6 J7 V+ {; Z; k+ ?( g" w7 h' n/ [
typedef struct
! c7 o1 O& v- {% g( j1 v{
5 q% p6 A* x4 I- o        unsigned int a;
6 r( }% U9 A3 N8 S' H5 ]        unsigned int b;: i3 P& J  Q, W+ U* z
        unsigned int packet_cout;
9 r# v( I, h7 b# X, _7 N}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 ^( i/ n2 r# [/ [
# f5 H+ d% l* i- K6 t/ U5 p7 |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 v7 d1 t" k* v: D- o- c# h4 sunsigned int count_copy = 0;4 ?5 h5 S7 [9 A4 u' m: o; R

; |5 y' X  }8 S9 C' x# A* g$ B  ]
2 c5 m1 ~# S$ t7 ^( D  @int main()
% R; o8 z% k& L* s" b{( V# X: |  Y6 v8 O- _- r. U
        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ {$ H2 M0 `) y& C3 s2 D        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( }" k4 O& z) `6 C7 ?. f, t& O
9 w) ?" a4 U5 }" j. B
        while(1)
; a: `2 M, X8 C, C        {( k: I: V- l' _; _. j; d# n/ h
                read_MSG_buffer(pshreRAM);  C: _+ A  q7 Q
        }               
5 y5 l! ^6 |4 d0 y! g+ Y* Y9 J}# [0 p+ [- Z  ?( `" S+ Z& T$ p# P

( r& y4 v& v( k5 M& cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 k! r2 c% b0 Z& }' `% B{
  x& \! ]0 A6 R! K4 g  J        RX_MSG_PROTOCOL buf;3 p, e9 X5 M( T  a$ r+ A, |
        , F1 a& V2 q& q  I; W
        buf.a = pshreRAM->a;4 N( c. g! ?2 F" ^* K' W4 U( @
        buf.b = pshreRAM->b;" r; i3 G9 O2 g
        buf.packet_cout = pshreRAM->packet_cout;
1 x" G) w5 }) h- P' O0 V0 k        ; F0 E; y' w1 f4 k! U5 l, R
        if(buf.packet_cout != count_copy)" `$ N  {; n" ?
        {8 b6 Q4 M2 m# B" _1 X
                printf("a is %d\n", buf.a);
; |; y' w& K% E; T2 z: ]/ Y                printf("b is %d\n", buf.b);4 H2 ?8 P& A% J3 F
                printf("count is %d\n", buf.packet_cout);
1 f. X  j5 M* `( Q" k1 N& D. D                count_copy = buf.packet_cout;
8 `& e- Z5 l& V: {5 c& w7 m        }
, J! z9 y9 X) Z6 C4 H4 L, m3 T        else0 f9 x2 ]$ G/ l/ K
        {
! }- U$ V* w/ H6 K2 G& N! v                printf("No effective message!");* v7 [% a/ X1 o$ z- e& r
        }
; c4 l' H: W- b9 ^4 C- ~/ R}! s  K; e: m$ M8 l3 S& E: A
2 n! z+ |% Q9 q6 R  h, c

5 g/ e5 l6 U7 ]' V# y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; p/ Z/ ^$ t  O7 E' ]& A, [
使用下面代码,对内存使用了mmap函数后:0 l7 i4 S7 t3 _( K+ H4 R
#include <stdio.h>3 y' \% I) G$ n. M
#include <unistd.h>4 ~3 [9 Q2 E4 ?3 h3 }
#include <sys/mman.h>6 U: G" S* x$ _) N2 p
#include <sys/types.h>* C5 b4 S5 p  ]0 l8 t
#include <fcntl.h>! O. h) b5 c9 z2 L! p9 F% z. _
: ~* }& \$ e+ C, V2 y; c3 t- ]
#define SHAER_RAM_BASE_ADDR    (0x80000000)/ b( r3 Y! L; C9 s+ C/ I, c
#define SHAER_RAM_SIZE         (0x20000)   2 M! [% f3 g5 ~; g4 V  H

) }9 s! S7 b: a/ s' b0 [2 ctypedef struct
8 X! i; N/ L& A+ m, d. I' X{
5 Q+ b* b) m5 @% F: e+ T; j+ g        unsigned int a;
% c2 U; y4 l& g3 S$ K        unsigned int b;
% {- C9 `3 U# c& Q, c        unsigned int packet_cout;3 b3 {* Y, |+ ^! _5 g: u; Q$ _& `3 W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 z9 N( J. h/ F" T  S& F+ j: t. O! o4 g
void read_MSG_buffer(int *baseaddr);
* h0 n* E! k' ]1 R: Kunsigned int count_copy = 0;0 x( @% h% J+ z4 E

, f" R8 P1 h+ I, D3 \) U: Fint main()
# [- @2 g; x# H8 X7 M{
2 n+ ?1 M: {3 f* `        int fd;
& S# y+ Q8 n# x- T9 x3 E        int *mem = NULL;7 e2 _  K. i2 l  n# x
7 d* c6 k; V+ K( D; P
        if((fd = open("/dev/mem", O_RDWR)) <0)
( \9 }" _5 \; F, S9 h        {: [) X$ Q' H; o8 [4 V$ B
                perror("open error");9 D9 P  u2 t. P' h8 I, {
                return -1;
9 {$ G! |" d& o' l0 r6 @* z        }
4 h5 m: U( c1 i8 C6 Y/ Z+ [        
  E% L, s- b1 S0 ?: P6 m1 V- Z2 j        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. {6 u) K" S& b+ t" R( F: e" c" \  b8 C' c3 u( r/ a/ r9 A; d
        while(1)
8 E9 H4 Y& ~3 @4 k$ o        {
7 X# Q4 B5 I9 W$ i- }                read_MSG_buffer(mem);; ~: j4 D8 H" B
        }                - u7 ~8 m, {* G( b
}
0 _: r+ P/ I4 Y" a; x
- W7 Q' V, B3 ~$ vvoid read_MSG_buffer(int *baseaddr)9 C0 t, t0 P2 G7 r5 h3 ]" Z( ]0 Q# z
{
: g7 y% y3 n/ t$ G( f5 P& R        pRX_MSG_PROTOCOL pshreRAM = NULL;/ Q0 ~1 b; n6 {
7 \/ H* |6 f8 P* t" y
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;8 ]! @4 G/ k* Y9 z# l+ D
8 W' Y/ j4 ~' @9 E% c' {& M. W
        if(pshreRAM->packet_cout != count_copy)7 h0 ?, V) F2 w" _% Y9 B
        {8 v& V% P+ C  m* N, u
                printf("a is %d\n", pshreRAM->a);
" X: T2 K+ ~6 L' C6 O! n" w                printf("b is %d\n", pshreRAM->b);
$ m9 U9 P+ |1 s9 {                printf("count is %d\n", pshreRAM->packet_cout);
% G% ]6 K9 p# O! @7 g& j8 [* U                count_copy = pshreRAM->packet_cout;6 D0 [+ b% l5 i9 @
        }, T* l: T" s! g9 e, r1 _& z; \# U6 L
        else" W5 R, x5 I  }# k0 L3 l
        {: f% O3 D1 g! ^9 M& w
                printf("No effective message!\n");( I# j; k% ]$ c- }
        }
: D* z) T, @% w) D}) `* Y. V: g- Z% q# p) a4 S) L- c# I

9 ], B$ t: O5 c0 l, _2 Y' U' f没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 `7 N0 B! Z1 G, b" ^% k
' {% i2 i# G% u" P3 K7 q7 r
8 `1 F8 @9 x1 j0 ?; m- d" }& v
0 K& U0 B( y# E7 r0 x' l5 e3 h. `) W* h" Z. [! f" n" r





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