嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 O) \% T6 Y2 }  t% r: W5 H* h% l2 y2 }# H# ]: v
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& R- D4 ]  x& p$ }, o
#include <unistd.h>
) r; Y6 ~, h. q4 F#include <sys/mman.h>
- q  b$ J9 _: x& A0 C#include <sys/types.h>
: z  G0 M& a( c) N9 T9 H* h#include <fcntl.h>  \+ X# T- }& Y7 ?0 n; |, ~
; |- u- D3 H% C. G# b7 {
#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 J) f) o1 V+ K3 b& O4 S7 ?0 `' u. F
* Z! [* }% |: ]: B* v; Y5 x
typedef struct; V" @, Y% E- s
{
4 @! K2 v. t+ P3 R8 r( M5 ]  g        unsigned int a;
) F  g4 D, W) O6 d7 y$ l        unsigned int b;
) H, z- M3 o1 B8 b. R0 R; d        unsigned int packet_cout;
- @1 S* `" F7 K7 z9 E}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. V% \0 p% j! ^& e; s% W0 ], u- V, w: ~; i& N  J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 s( \$ A4 X  ]9 C
unsigned int count_copy = 0;. u% f& O5 ~) q; n0 B

; |! f# l4 h) f: }2 w$ R# w9 s. t1 ]4 C8 B4 m; Y4 L. E' p
int main()0 }- d  ~$ l9 O8 {% A, e
{4 p, n1 p7 y( r8 \) R9 W) P
        pRX_MSG_PROTOCOL pshreRAM = NULL;7 k2 ^# ^" S2 `9 Y  A1 s5 B/ z
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- P* B: n6 R/ Z) R

8 O! W& ~4 s* Y; e        while(1)
/ X& Y7 K; ?+ }) Q5 Z3 `        {7 j+ b) M, S( G5 m) A+ K
                read_MSG_buffer(pshreRAM);
$ A  O1 n. l5 Q* I; Q6 c# b' z+ D        }                ' |5 J3 t+ s1 o, e
}3 O; }- I& D; o; V
/ O, P9 i- X( g$ R4 L( d9 _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; c- B/ K. d7 e5 G3 }$ T0 ~{
% p) B5 P1 z9 [8 r( L% {        RX_MSG_PROTOCOL buf;- J4 L! {! F- B* Y$ S
        ) ]/ W; y: u) C1 ?7 b7 |
        buf.a = pshreRAM->a;
" u9 K& p$ p2 z  ~, j# k7 f% o        buf.b = pshreRAM->b;6 d6 E5 I" k& ^) ^. ?
        buf.packet_cout = pshreRAM->packet_cout;
: M7 n, i' O7 Q' p0 d3 d; d+ i. g        5 L& }: Q+ X  j: }2 O' `* x" e
        if(buf.packet_cout != count_copy)
2 ~2 t' f  R- x1 ]! }& _+ F        {
; v  v. w& T! _8 J                printf("a is %d\n", buf.a);$ C) K0 ~% X- t; `
                printf("b is %d\n", buf.b);
. D- G3 |+ P. H7 i                printf("count is %d\n", buf.packet_cout);& R$ O( O7 C, b4 ^5 @' S' |( S
                count_copy = buf.packet_cout;/ ^& Q) U" T$ U3 E5 R/ s
        }9 [% S0 Z, d0 `8 O) H+ A( I6 v: N
        else
% V4 E# E( P2 V5 d        {5 F$ G+ O& H- g$ e. R2 {
                printf("No effective message!");/ K" k8 E' S2 T) A8 P! X5 [3 U2 m
        }
) U# p/ c+ h; x" a& Z" g}
+ O+ O# ^8 l& q* O1 P7 v2 o
) C* D2 L9 `7 i; I3 z9 Z( _' s# x& `) \
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 x  S/ K: K( X  X( T4 d; X* p
使用下面代码,对内存使用了mmap函数后:' j  O+ Y! @" i6 Z
#include <stdio.h>4 i/ O  t. U4 Q
#include <unistd.h>: r, @, N# m( {; m
#include <sys/mman.h>
, d! e% A+ c8 V. Q#include <sys/types.h>
1 |) B0 m( T; E% M! r1 y) G0 c#include <fcntl.h>
' j& u* J  J- @1 i* J5 W# ?* x; C7 g& V/ {
#define SHAER_RAM_BASE_ADDR    (0x80000000)( I2 {& p$ O2 R4 A+ T7 n
#define SHAER_RAM_SIZE         (0x20000)   ! m7 H. o) p( W: E

+ i2 `0 h# o- J3 h' d- G6 Ntypedef struct
& v  r7 j2 X8 \{
# s- ], r# E" r; d* m! L( a7 D- ^        unsigned int a;
6 @- V! g  J4 @5 g' `        unsigned int b;
$ F9 k" g  w7 q5 z: B3 u        unsigned int packet_cout;; f0 N, D3 g/ ^9 G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 v. `% n- w+ P7 C% Y" l
1 ^, Y% b6 q2 {! H( ^5 g& E0 ~
void read_MSG_buffer(int *baseaddr);9 w6 F) e) Q4 k/ q0 k
unsigned int count_copy = 0;
$ v$ A! W. n5 x: Q3 ~* N2 M1 v* \0 F+ X* D! P9 s5 s8 w
int main()9 X2 Q0 J$ F% O# D# a6 W
{
1 S, K- k  W  E) ?        int fd;& J* E5 y0 v9 J# I# h4 D
        int *mem = NULL;2 C+ @3 X" d3 [! C$ w, o* [

' \7 B, |! [$ m8 U! ]6 Z. x8 W: H        if((fd = open("/dev/mem", O_RDWR)) <0)4 J2 B, S: x" I1 n/ Q
        {0 q. Y/ K' U# c& }6 S) H
                perror("open error");
4 U$ Z! B5 C% Z                return -1;
6 G- T5 `, [: @6 _8 z8 _$ q        }! v. M( v! w+ c$ Z% u' M3 n
        - F3 z0 `* m- p' e
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( g# M6 o. T: p# ^4 E3 m' }3 L
* Y' T# _: j- V        while(1)+ L3 G7 ~9 t( D6 s
        {  {5 {( z8 F$ L+ m! `
                read_MSG_buffer(mem);
3 |$ P" l1 p+ P* u& b        }               
2 @( E8 h4 f* ^2 b5 C# i}
2 a8 H$ O. ^/ g* {, n! p- W5 T, H2 e
void read_MSG_buffer(int *baseaddr)
& W( S  i3 c5 K$ B1 k- L5 N{: L2 g5 n4 J0 y+ e0 o7 @
        pRX_MSG_PROTOCOL pshreRAM = NULL;0 f7 B9 q$ }9 l3 _  `. d
2 [$ D0 U& R! h
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; K0 Z3 L3 t  J( L6 r8 h
" ^' W  a2 F& a9 h* F        if(pshreRAM->packet_cout != count_copy)
2 k/ l& G% c+ G4 y% v- Q. d        {; N& y$ r8 m: ?' r% U! D4 p9 T' e
                printf("a is %d\n", pshreRAM->a);6 N" B6 r7 ^9 T5 e3 v
                printf("b is %d\n", pshreRAM->b);  i- l7 j3 \: c2 t, p1 o
                printf("count is %d\n", pshreRAM->packet_cout);
, g+ ]0 Q% l/ p. G. x                count_copy = pshreRAM->packet_cout;; ?9 \- A# e+ B7 Q
        }2 H- ?- Y+ k$ d8 U( w* g+ T6 f0 J
        else
6 |# J9 W) ~) b( ]5 m( G" c1 V; p4 o        {
8 |% N  n0 H  W                printf("No effective message!\n");; ^" M+ F7 r; ^* p- r, U7 Y2 f
        }- g( E- D1 w# ]. D1 a
}7 w( e* S# k* B- ^6 B* I

9 h" |- s5 I# p5 n/ v( ^7 r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 A  m" P& F4 ^$ |/ C3 w0 J5 t! h0 w
+ c1 H! [) E1 U* U- d' \8 q
3 _" j* \; Q! P4 A) U$ I3 x: X8 p1 a' w; u' G: ~9 {+ P8 T

5 _* ?' h" e. Q5 A; {




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