嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ( R: l! o4 n$ V9 v
& U3 x0 F% j" q, r
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 T9 h, z( J1 ^( D
#include <unistd.h>' C1 E0 x% q! a: a" J" s
#include <sys/mman.h>
. u. d0 Q1 l# t3 B  Z5 d' Z* A#include <sys/types.h>
7 U0 {* L) M+ u0 q& w! ?#include <fcntl.h>
! r% X2 f5 x0 d! P( y, U
: b! H; i7 G3 u2 U% ~- B- @( }#define SHAER_RAM_BASE_ADDR    (0x80000000)   7 m) j& E2 K$ M* a8 Y! v) R

6 P/ J8 e- Y$ F: ?( Htypedef struct  R2 g% y9 v" Z4 B
{: }$ z  p1 U- f) `& S
        unsigned int a;- e* ]$ q2 x2 t! b3 A
        unsigned int b;; q. K; V: c! W" O. A: w) E
        unsigned int packet_cout;
* s! u9 K9 R! g' A& P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' {/ n# p6 M5 B& H9 T; r, W# I) k( `% T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' h: K5 x7 |& r1 s" j# u
unsigned int count_copy = 0;
' A  V  g7 t- g' k0 P$ l! ]* B
8 y3 w& }% B! X& _4 K6 `  ^! E+ P) o" e
int main()
: |; d8 j- m6 r- |: m$ Y* [{
. a6 \9 M: p# Y4 R        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 U  }  t3 g. B% K& ]6 @5 l        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;4 \' @, M: N0 h4 m7 r4 C# H2 h+ u( {
" E0 V# g1 f+ E$ g
        while(1)) m3 {3 R$ x4 k5 e% [
        {
, n, G% ?0 r% z6 ~2 P/ }                read_MSG_buffer(pshreRAM);
) w# E* a, H0 e6 F        }               
, f- `/ L7 b: W1 _% Y) P}
/ m( l: e+ m* C  x7 Q
: w/ Y4 z9 Y0 U4 \9 Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 R# f5 u8 `+ c. ^7 G8 `
{
0 F# t2 M. P( f/ E( R6 u! }* y        RX_MSG_PROTOCOL buf;' C( b9 q  k; r. n( U; ~9 i6 |
        + i9 }: Y6 h6 f* J, h5 J7 m
        buf.a = pshreRAM->a;
1 s  K) M& z! W, F( ^        buf.b = pshreRAM->b;4 f' B/ F/ T+ g! n7 p
        buf.packet_cout = pshreRAM->packet_cout;
: C( i5 l: u% _0 ~        
: c# b- L( c! l' m4 t1 V        if(buf.packet_cout != count_copy)$ J7 `& c/ S# D+ g! Z
        {; [3 |* ?# G/ ^7 ^
                printf("a is %d\n", buf.a);
; [4 `( ~# H; T2 C3 u                printf("b is %d\n", buf.b);
% d$ |( D% E0 C, g* A) d: T                printf("count is %d\n", buf.packet_cout);  `0 `+ b7 J+ {8 O4 ?
                count_copy = buf.packet_cout;9 l. C4 v. K  T8 `- \3 Q3 j
        }
2 G" G3 F! h2 u" n# X, r0 K        else
  i: I$ R# d( U/ ]0 V: d9 E        {
- |3 R) \- M$ Y0 X/ i" U                printf("No effective message!");( n* f3 X& n1 [3 k( z* [
        }
0 A+ y, U9 _$ a% a* {8 @}
$ z- X3 @; H3 q0 W1 U2 S" H
9 }0 U0 G  p, L. L
, M2 _8 k6 X" X但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 b& u+ q8 J7 q+ Q
使用下面代码,对内存使用了mmap函数后:" q. k6 i' ?2 E% _! S+ M
#include <stdio.h>' U! x9 P: @" [- e2 R5 z4 e5 {+ v: L
#include <unistd.h>4 U. e1 v4 F% e3 [% M5 Q1 D
#include <sys/mman.h>
; h9 z0 _1 ?) E2 i  F3 U* W# h6 V#include <sys/types.h>7 m2 D8 [7 z4 [# l& B7 c
#include <fcntl.h>1 ~  o  S4 e# t
9 k( n1 `' S9 D) F; m* m4 d' \
#define SHAER_RAM_BASE_ADDR    (0x80000000)) \; z5 z' E- v3 h
#define SHAER_RAM_SIZE         (0x20000)   - Q: v7 F+ ^; j' q& ?) }/ i0 U
3 `3 A; Q) U# v9 w$ g, ]3 E
typedef struct
/ v3 i! Y3 u& a7 a0 [" Z; x8 R{
- `0 J  b0 N" H7 e7 G" W) }        unsigned int a;  P! p- H8 I: u8 _' {8 ]& _) A
        unsigned int b;, d# H( f  [$ E1 a, ^+ A, M+ K( P1 X
        unsigned int packet_cout;
8 ?1 Q' u. \* I}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ h" s0 [. U9 [

+ Z' _- r: x  [6 lvoid read_MSG_buffer(int *baseaddr);4 h8 `$ ?/ B' k* D  c! I
unsigned int count_copy = 0;4 K5 {  ~; \7 x

: P, E( ^/ R, O- Tint main()
0 f1 P* d4 k, V+ X3 c{2 ]0 l) a# {& b5 E) F( D
        int fd;6 j* C* ]: M1 i8 S5 ?- I
        int *mem = NULL;
' y1 D* R- f4 h1 ^% I; Z) v/ t" c; u/ m7 A5 [& e/ k' f4 Z
        if((fd = open("/dev/mem", O_RDWR)) <0)/ J2 E/ t: Q4 l3 |
        {; Q$ y' h  c1 k! |1 Z  B0 U) Z1 t
                perror("open error");4 @0 [: ^  t) S& P7 L
                return -1;
# G# s5 p. D; `4 ~) [, t0 e        }
/ v2 p+ h3 |6 g        
; y8 Z; t0 G' {3 d$ G0 N. q        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# I, W' p" i* W+ |3 P
) U: r2 e- c: W! V        while(1)
% A5 t4 a) o& B$ g$ ?        {3 R$ {, O+ o# y2 u+ Q% O
                read_MSG_buffer(mem);
. {* p( O) F% s, T) m4 ~        }               
' ~/ e* E+ [7 `2 ~# T6 ?}( _& i; \( l% k0 ^4 `2 v
: V- B" a1 {3 p  \1 q$ p8 j6 c
void read_MSG_buffer(int *baseaddr)" ?7 B5 f/ V! ]
{$ [2 p! ?% E7 W# b
        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 |$ r. Y# i+ }3 \- K' D& w' ^: N, d& ~' \+ P' q$ v/ \, _
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 b0 R& O! o4 H' A& [$ ]7 E
( K' e- W2 a7 x4 {$ J        if(pshreRAM->packet_cout != count_copy)
+ A/ z  b9 G3 k& v, n( l        {& u' [& p2 s; w) r; a
                printf("a is %d\n", pshreRAM->a);
2 E8 N0 m- G" R                printf("b is %d\n", pshreRAM->b);
1 A1 B0 B, m- M7 k  R. M                printf("count is %d\n", pshreRAM->packet_cout);' m/ P8 M7 c6 \5 E* H: m' x2 @8 `
                count_copy = pshreRAM->packet_cout;' m, k& p& C, U! u
        }
, w# G) e$ b9 v7 h+ g6 ^  p) B' d- J        else9 J6 B. t  s/ n6 p( \' B/ ]& J
        {8 ^  v# h$ w0 E  K9 p
                printf("No effective message!\n");
: O; I) x* P9 ^1 _        }6 f. M+ i- m( x3 L$ w* S
}
1 [! L2 V7 W8 b. x5 i+ M+ u/ U- }
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 ^% ~6 X* q% W# }$ ~
) X/ h* e# u+ U+ Z, ~; F, P3 A& u5 y) N3 q) o8 x. Y  [. w$ G
, ^5 C! n: q) K; M; T9 Z
  r4 }- T# j  J% T6 D2 f





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