嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 C- [/ P' t  ~; m8 e, W8 l6 w( {! q7 Q, O8 m5 k" Y# ?: F4 `
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' q" C+ r, j$ g7 V: [#include <unistd.h>$ B0 N5 d, c$ X9 h0 K) s/ K  C
#include <sys/mman.h>
! N+ i- I( Y5 p5 D#include <sys/types.h>
6 r9 i1 Z9 ]/ m& t#include <fcntl.h>
/ J! [* B0 z4 g- q; @2 D! t3 E) O: k
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
. m: a2 I( R/ a
2 w" D8 T* |8 W4 X0 W% ltypedef struct
/ m" d* h% E/ q{/ \& o! x) M7 X& B5 S1 A$ m
        unsigned int a;
+ D7 y2 _: e- D1 `' E- S        unsigned int b;
0 {9 x5 Q5 a3 d5 m" c6 u        unsigned int packet_cout;2 f9 L5 [1 w' G3 j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 [* Y+ e# ?/ V
6 k0 j; V: }/ [+ N4 N* }5 ^2 i: K# S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. b/ D' W8 U: D0 Eunsigned int count_copy = 0;
: E1 O! d$ N2 Q* X" t4 ?' F5 Y
) P2 x; @- I. W2 |9 D) `) R4 l! u0 g6 A2 x& p- @' i7 ~5 r4 {
int main()5 s$ A: x3 v& d% k" a4 u
{& y% P8 M& H2 ], E
        pRX_MSG_PROTOCOL pshreRAM = NULL;; ^) x$ f1 R% T6 |
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( F: z; e# W& H, M6 {( J: `: e* ~9 U0 X4 L1 o4 R% o
        while(1)
7 F+ N" A1 Z7 @8 j0 b6 G: U        {8 L+ U9 N4 [8 J7 j5 p) j
                read_MSG_buffer(pshreRAM);
7 h. A; J" p% F1 P) {        }                9 Q) G: R  J4 {! k$ W/ r
}
' l( V% m8 F* p* e: ~3 g* F" V$ S- q8 I9 r5 ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 _* X" W6 w: f5 l
{0 x: x2 k+ x% T  z' Z- T
        RX_MSG_PROTOCOL buf;. i6 r) Z% t$ l4 \8 r
        ) ], Y! h2 n( H
        buf.a = pshreRAM->a;
/ @3 l  ~) n. \3 P- t        buf.b = pshreRAM->b;0 F  t4 h& \( ~4 i" d
        buf.packet_cout = pshreRAM->packet_cout;
- X" T% X, g- B+ |        
5 a. E4 ~& I; C# s1 F        if(buf.packet_cout != count_copy)
% E  Y8 s: l: Q& @& ~: \( m, F        {5 ]' ^" E+ T9 n9 w
                printf("a is %d\n", buf.a);0 g7 z# ^2 e, f$ A% ?
                printf("b is %d\n", buf.b);
  x: \* S& _( q9 {$ d' x                printf("count is %d\n", buf.packet_cout);2 v$ ?; l% i+ f% l8 F$ |, `% M( i
                count_copy = buf.packet_cout;! ]% n% f& m: [3 _7 L
        }2 G1 w" d8 @5 c! V2 h/ e% E  |& q
        else
8 h, H' k* X' \2 C! k) {, o        {6 }9 ~2 s& `  Q! e) K4 F
                printf("No effective message!");
8 I+ O4 S. a9 E  B" _( i        }
0 M$ v: a7 G6 z% K" |}
& f4 S* i* O7 l  X3 U) k/ Y' w1 `- M# g* ]. O9 C
* w! ~  d, W8 ]/ D# h# t4 D7 W% q+ c
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 c0 y* z$ V6 O使用下面代码,对内存使用了mmap函数后:% y: T5 Z4 S; h( s$ s# ?- a
#include <stdio.h>
4 W/ `8 m4 C" V- ]#include <unistd.h>9 S& L' g* Z9 o9 ]! N
#include <sys/mman.h>( C( Y5 c* u- l/ |0 o7 ^
#include <sys/types.h>3 c" k  H7 H( u- C3 V
#include <fcntl.h>' C/ O% M3 q6 u
. p% Q! c5 ~. @7 X4 E
#define SHAER_RAM_BASE_ADDR    (0x80000000)+ _( I( N4 u. D) b/ Z
#define SHAER_RAM_SIZE         (0x20000)   + y/ E4 [* [5 i! H" o6 x8 S

0 [% X( C/ ~* y' E2 g1 \! Q+ x# dtypedef struct8 y0 ^$ P9 W7 |7 }. ]- V$ D
{
4 h  ^( R  y8 g4 C; L        unsigned int a;1 j1 G1 y7 d8 }, U( h- M% y
        unsigned int b;
# B! [3 F$ p5 N  ]0 U* ^        unsigned int packet_cout;
3 }  m% c8 c; u2 q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" N: G; ~! V3 [$ M  Q/ R  K
" C( u# g! g& H+ z3 x* r3 C# Evoid read_MSG_buffer(int *baseaddr);
+ L$ z2 s4 |4 xunsigned int count_copy = 0;+ E- o( w2 f; G
3 a) v$ C9 M$ X" p$ H6 i
int main()
/ |0 Q  {- o- T4 O{1 r# d0 K3 f- m, F
        int fd;& t% [- t$ Q" c, [
        int *mem = NULL;* [# A# ?; `: ]' S$ @
7 R7 K% w# V+ J; q& ]
        if((fd = open("/dev/mem", O_RDWR)) <0)" a0 k4 W$ T, ^$ \0 Y  m8 Z
        {) C, c7 H# ?% \2 H( x# Q$ ~
                perror("open error");
% k8 e9 ~/ V9 w1 s- \                return -1;" [& D8 V) `9 m. I
        }
/ T" @  d" y0 g9 H        
8 k+ O# o5 c0 X# O& X6 c3 C+ K        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% }, s/ v) u& `  `

8 ~2 l7 C% @' a7 b        while(1)& D# k! f( a- x: R" Y- x; @
        {
& |% E* g* S. A3 ]                read_MSG_buffer(mem);$ @8 u+ ~* r" C
        }               
1 H  q, Q6 L, p; V3 e4 s1 C}  C$ R/ H; g+ |" @# o1 l: f
: H% W: N! I; d1 R6 B
void read_MSG_buffer(int *baseaddr)! ?4 r' \6 X! Q' ]
{
, q1 q; w" e3 \, `. X! T        pRX_MSG_PROTOCOL pshreRAM = NULL;
! l3 S- [1 w( [4 Y( b
' M- S, ~. w2 c% U, ]2 j# [* L        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ D6 ~# @& n- `+ C8 `

! E" H9 l2 ~: o# r9 f* c( ], y$ q        if(pshreRAM->packet_cout != count_copy)0 q" ?# i/ D* ?" O
        {' ?- j- \6 Z8 y8 R
                printf("a is %d\n", pshreRAM->a);
& y( D2 M# D1 g9 B( o                printf("b is %d\n", pshreRAM->b);
! n( F$ ^$ g  N( Z                printf("count is %d\n", pshreRAM->packet_cout);
. Z* X  J& e! t0 B% q8 ^$ p                count_copy = pshreRAM->packet_cout;
2 |9 g4 ^  a: c# U        }  t% S- H4 ^3 ~
        else- I! y; Z4 N7 M
        {# ?; i; O& i) {1 l5 X  F4 K, |
                printf("No effective message!\n");
# w! \' R. w  w        }
4 G7 {/ H& F( y}$ p, Y! a& i! v" M3 B
" ^0 l- B9 D7 r+ s6 G
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 S# n1 X) j/ \0 E; i8 z* r/ U& q( o" c* |. |: }

: c3 z9 S  J2 w# Z4 w" D5 F  C; L6 }2 C: n- l0 e/ y

' f& H- U$ V9 U  k6 i5 }9 ~




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