嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 w( f2 j" l* G% D& L9 z. w
( ^- g. N' D0 Y2 D, k+ A
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! i3 n6 Q$ o  f' W4 m, D
#include <unistd.h>; Y9 a. c' T; {
#include <sys/mman.h>7 u7 ?, R% F$ o: c* C# ]8 b
#include <sys/types.h>
8 Z6 ]0 V1 I. a3 ?( B7 T#include <fcntl.h>5 ?5 h% ]9 T# F1 H( n  g7 q

5 ]% T8 ^) t" {  H7 t  k, V+ ^#define SHAER_RAM_BASE_ADDR    (0x80000000)   6 Z& H/ n, u% W& z

% G  A; \1 o& `, v6 Z. J5 ztypedef struct
" m" o# U7 w4 a$ e" c{! S) U& v  x8 g
        unsigned int a;3 f' }7 W8 g9 q: Y
        unsigned int b;2 ?: n. D/ }) \& C4 e
        unsigned int packet_cout;+ I( Y$ d' t2 N) Z: H( h6 M
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 N' O+ S  |+ _4 B! W) G2 M
( l. t( M( R' W- M4 a/ o; E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);0 m/ o' F" V; l3 T( m9 r4 E( E
unsigned int count_copy = 0;
0 s1 O; y1 q' L7 [# I! J
1 x5 b3 \1 t0 B4 U2 C. C, w4 {$ c" @2 n
int main()
/ a1 Z* S+ r. Q9 K* A9 g) Q4 F{5 o: i% I8 `* G9 X
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# }; t! K- _$ ?! \        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, h5 g) C! h+ y4 u! G3 c9 E9 e
, m- S" S* W4 d/ s
        while(1)
9 G' P% C2 V$ E5 n; F+ r% j' \- m        {
/ g3 t& V, `6 D5 P) {                read_MSG_buffer(pshreRAM);
& O9 {3 F# i$ Y8 W' U        }                " c8 ?' y2 z9 l( p
}
5 `# x* e9 i% W8 J: ]; g. y3 X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- s: n" P9 t& ~
{% P7 @8 S# v& @, P7 v# P8 [
        RX_MSG_PROTOCOL buf;9 a" P  b% A" n6 s
        
5 |2 Y4 x  T& `8 @1 G: v        buf.a = pshreRAM->a;
  h0 L: K0 _) B& X. k7 ]4 n        buf.b = pshreRAM->b;& R6 P* \" I8 |6 {; ^. a8 r
        buf.packet_cout = pshreRAM->packet_cout;
3 d% t2 k! k1 W0 ?! w! @; r        2 w9 c4 q9 O+ A: Y' [
        if(buf.packet_cout != count_copy)
7 Y% t- m$ B+ B. l7 q( L% _        {
( J. y. x7 S& H8 q                printf("a is %d\n", buf.a);; c6 u2 \2 E. b. z
                printf("b is %d\n", buf.b);
) H" q$ |1 T# v4 x                printf("count is %d\n", buf.packet_cout);
3 ?: Z8 y0 o* H& m9 _1 @0 I; _. h                count_copy = buf.packet_cout;
5 x: T# L) \7 w        }
" V* J8 d3 @1 L0 K/ H# E4 [1 U% }. A        else
* `7 ]; f# Q( g& ?1 R9 o" }+ ^        {! g6 @) q0 ^+ _- P; s- g
                printf("No effective message!");5 t- a9 j  ?' n/ N
        }
- u! w. p: f( H# y* N}
# I9 [* Z% \( G  E! p: ^
4 r" A9 \' p! \. s  I4 k1 M1 h; S1 ?. S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) ~3 U9 H3 t! A5 b" y$ s: q使用下面代码,对内存使用了mmap函数后:
3 f5 [+ ?1 y- ^#include <stdio.h>/ Q# V2 R% `1 p- p
#include <unistd.h>
! s% ]8 Q/ ^. b8 b#include <sys/mman.h>( x1 c8 D3 a% K1 W
#include <sys/types.h>
+ G2 }* R2 p! e9 N! }6 l+ Y6 J( ~#include <fcntl.h>
  Z1 K% w1 M$ e3 X
. t: W6 s2 J" p' k: F#define SHAER_RAM_BASE_ADDR    (0x80000000)
  l; ~1 N; T) [2 p#define SHAER_RAM_SIZE         (0x20000)   3 ?9 v$ I9 i8 w" Z: Q
+ X! i7 P+ g0 Q4 w
typedef struct
, m. Q# ?- B. D# }( ?{
- Q! v+ U, u, T* I6 ^8 c8 B/ K2 z3 ?        unsigned int a;
# M) f3 w1 |$ t% @7 `        unsigned int b;
3 I) w8 v; h# _" S! ~        unsigned int packet_cout;6 d  y9 j1 f- T; @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ I& E: Y, ~% Y+ p! W$ K. R

- n  o. J2 k; Mvoid read_MSG_buffer(int *baseaddr);, `. [, e* n7 V3 W. m5 w" x! g# M
unsigned int count_copy = 0;
! M6 h1 _7 J! O; m7 ]6 L8 R; c- `- I. f; v+ z/ q# p  N
int main()
6 L) u# s1 t1 ?# m9 K9 t{
; O( o: u+ Z$ p# W) D! d  {        int fd;
* g, L; d: P, o- x5 }" t: k        int *mem = NULL;* R' y) J+ b# |1 f

) d" x. t% I1 ~' i! M        if((fd = open("/dev/mem", O_RDWR)) <0)
: u4 V- P4 M8 b        {
* `$ Q, L' a# ?5 B; M/ K* B                perror("open error");
! P2 x# }* C4 A' O/ ]6 p                return -1;0 O( `4 p8 z  c
        }$ }: c5 |/ B4 R! Y
        & C( Q' X4 c' ~1 @# S4 m
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; ]' `7 Z( Q5 g
/ ]  y+ @. S- z; i$ C+ v
        while(1)1 {1 j  p0 z7 T% o( z& u
        {& _8 J( a* B- Y+ i9 k3 i# r
                read_MSG_buffer(mem);
# @( _" O8 _. _% o0 [% m        }               
  C: g; l+ z2 D% ]& w; \0 v: J}
2 r9 _! U  ]4 H( g. T
7 [+ A" @( d( [4 F8 u# lvoid read_MSG_buffer(int *baseaddr)
$ ?2 T+ \* [2 \9 F{# P+ y% Q1 T% L. l
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 G; @+ \4 c7 R- F- G% S/ B
, O+ v) L5 x& F$ Z& r) |
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- G; x. P: I3 H1 k/ r% l9 m/ _

- U* S. L4 S; j( j; x: B        if(pshreRAM->packet_cout != count_copy)3 k  @6 {9 A- N: T
        {
: \9 ?7 k1 M7 E* J. l5 Y4 S* R2 H                printf("a is %d\n", pshreRAM->a);
0 _; [6 P# a+ q" U                printf("b is %d\n", pshreRAM->b);$ a4 ^5 n5 F" j) F* S
                printf("count is %d\n", pshreRAM->packet_cout);
$ m, \" W. W1 b8 Z3 r( F                count_copy = pshreRAM->packet_cout;
+ C! c3 e( K5 k5 L) M        }
0 d" p& H: g0 V; W1 I: f7 d/ O* w6 B        else
/ j0 f9 [! g9 e; X+ K2 I+ N2 u. S" q2 S        {
, a$ y% U9 K. R8 w9 T0 z                printf("No effective message!\n");
" k" ?1 C8 G% B        }
* ]' n. m+ t$ E}
5 b6 Z; B+ f- P( T5 v' E+ j" x( H
+ B) o4 c6 W9 v7 A; v没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, ]9 @5 v. F! O- r- a% ]% a% U$ j5 ^; `2 a9 [9 f7 `6 T8 _
1 G$ M) A, \5 ^6 P# `0 i4 \
; A5 A. |& j# @) @
9 y, }) ^2 j" B# T9 e6 h  B0 D; l





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