嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 F5 ^& X# N9 [* ^, _5 _& R6 M$ [; v7 \  g5 T8 a+ r1 W2 I7 S
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ [+ Q8 ^2 r! {
#include <unistd.h>
6 b/ f; z7 H/ b% B#include <sys/mman.h>0 ^/ y' E  X) C% E3 x5 p
#include <sys/types.h>, W, q" N7 k: y! M. v
#include <fcntl.h>
$ [  d5 B" G3 X+ f8 K) [: c! v
* A  O  n% y$ g; r- c#define SHAER_RAM_BASE_ADDR    (0x80000000)   & R3 L0 d% W+ t) V
4 E( J! F2 D# }8 \; L
typedef struct( a- A% F4 S+ ~1 V8 Z0 O# z. T
{
. u( j. `2 n5 r" B0 O        unsigned int a;. \5 q7 O  C; z5 C. v2 U0 b- v
        unsigned int b;, O# k! X& v: T+ t2 f6 @
        unsigned int packet_cout;
, B  ~/ [+ w. N- z- V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 c$ X/ f! i5 {/ m# _1 B
" z5 i) |8 [; v, n1 o6 m+ n- ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 x) E1 r' @% T" Y0 S
unsigned int count_copy = 0;
. l9 g4 s! c- q6 b& G, V* {+ S
; y5 M, q% N- r- Q2 i0 s8 T6 B2 _* Y# t
int main(): q8 ~( ~& G8 Z+ Z' C
{4 s, N. W' \$ d! s0 J
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# ~* b6 s! H5 z# \        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 M7 E+ y7 o. q" X( |' q# M
" d0 U4 ~$ m  b' W! g        while(1)1 m1 Q1 P$ U8 i' F" e* e
        {2 N. `8 m( j% U. F5 X
                read_MSG_buffer(pshreRAM);
" @. ^" a/ N  U+ H# ^        }                % o% e2 O# T9 A% R
}$ q, V! B* I: Y" k- G

3 Z# P8 K" Z. r' hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 n. ~2 `4 ~: Q" _5 {& o{
" y, \; q5 |4 u; i+ H2 J        RX_MSG_PROTOCOL buf;$ d, a/ |" W2 H( d2 n
        / M9 m; G- y9 f1 v
        buf.a = pshreRAM->a;
1 _8 V/ w; Q* k) N8 N1 E        buf.b = pshreRAM->b;
$ I% _+ J$ v& d* K; e$ L0 i1 K4 ?+ S; ^        buf.packet_cout = pshreRAM->packet_cout;/ r4 I* Z+ @7 O9 ]6 a5 y
        
, R+ d6 B4 f! _7 C( j        if(buf.packet_cout != count_copy)
9 \+ b7 K' V$ N& K        {0 }2 m* x. q$ y. c3 Q' J
                printf("a is %d\n", buf.a);! E7 K1 R3 k# T: e( J) u) x
                printf("b is %d\n", buf.b);
' P% s  i5 w7 o: h" f7 f: U! @                printf("count is %d\n", buf.packet_cout);
! c: e4 v5 q5 r3 V! ~: L& b0 ~/ r                count_copy = buf.packet_cout;3 `; }0 Z+ {+ B9 Q- ^
        }9 H* s: ^& f7 ?
        else9 `9 M& J8 Q1 I! K% s
        {
# ^9 I. F. ~& \) [1 u                printf("No effective message!");
) V* x! `* l; Q; |. Y7 ?9 X% H        }- |5 D1 t( m! D
}8 f+ U; S- ]$ I; U

$ g: ]! r' H! i# ^& m4 |9 [7 E3 m4 H/ P/ U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* C! D3 y6 E1 a) X6 H" O7 s! r9 D使用下面代码,对内存使用了mmap函数后:
8 u) n8 _# I, J  P6 E2 o#include <stdio.h>
; ]$ W( Z, {+ }8 `#include <unistd.h>
/ H3 N* Z, L- t* ~% N#include <sys/mman.h>. q- T4 F' U8 p" o9 U" u
#include <sys/types.h>
" |& j( g" e# |0 \$ F! U+ o#include <fcntl.h>" W& h4 Z( O: u8 D* O' d

9 D3 _) k5 }3 J- ~) g  q$ s# k2 p#define SHAER_RAM_BASE_ADDR    (0x80000000)+ i% Y- X8 W" ^6 u) q( Q( e, B( ]
#define SHAER_RAM_SIZE         (0x20000)   # ]3 |% ~( x5 R9 _8 J6 L

, u/ a. a/ W5 Ctypedef struct
0 B7 q3 u- u2 L' B9 l{
1 U/ e* G8 M1 t( C# r        unsigned int a;
0 \' r- K/ u( Q- n! m* d. u- t        unsigned int b;
9 I/ b" e" o" C0 D        unsigned int packet_cout;
/ t! M! A, i/ J" L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 p8 E9 ~3 L4 z  Z2 I9 }4 E! ^5 D1 l0 @* V2 d1 v
void read_MSG_buffer(int *baseaddr);: B% h! N: q  g, {, C) K9 v6 ?5 w$ L
unsigned int count_copy = 0;
/ b) g. }; O3 k$ ]2 Z  S3 A/ Q" _; t# l) ^! z; a; _
int main(); f( Z! k6 j) R3 ?
{, U0 Q' j5 q+ w' H" p1 d4 i6 B
        int fd;( p2 p& a: h  p
        int *mem = NULL;+ A0 z- z3 g; C" J8 g! Z: f, b

% }# C, p- ^' Z1 ]6 Z* j6 H5 {! \        if((fd = open("/dev/mem", O_RDWR)) <0)
  d! q# u( j" n5 o+ y' x& I; n        {
  |% e5 g, h& |                perror("open error");
" p8 m& h5 _+ x9 c                return -1;
; w* P4 X1 i) L' R        }3 ~* e1 a" y' c( E$ i
        % Y( \; @4 K1 U# j. W
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ E! u1 T+ C8 b7 x

+ Z, L& d# I( r' D        while(1)
5 R8 A  `( s, j8 g        {6 _/ J- _* y' O. ~# Q
                read_MSG_buffer(mem);; i& _% f' e& `' S
        }                ( a0 Z8 n& X  ~7 \
}' h) j: Y. L9 b- s/ K. D! O
) Q/ J/ O! e/ b- b
void read_MSG_buffer(int *baseaddr)2 s! e4 E1 U0 b1 z
{
. @0 r4 c2 i* y- A/ F8 [        pRX_MSG_PROTOCOL pshreRAM = NULL;4 L# o0 L- H, s" |3 p
0 R- g4 ]: \/ Y( `
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 X5 ~# D0 t' ?

4 ~; `, c" ?: j0 w4 C2 Q3 }        if(pshreRAM->packet_cout != count_copy)! q  M) l/ q( V9 Z
        {7 U6 e' T  K) v, n3 M
                printf("a is %d\n", pshreRAM->a);
+ |, G7 l! i9 X9 Q                printf("b is %d\n", pshreRAM->b);
! x2 U# ^0 B- ]1 Y                printf("count is %d\n", pshreRAM->packet_cout);
- d/ O+ m( s  W. H! J' h                count_copy = pshreRAM->packet_cout;
: X& i' d0 q  @5 I) W/ B        }( l( ~" x3 b0 N; ~
        else
, H1 a, c- V) B1 e" ]        {
" j& Q7 e& z4 ]* Y                printf("No effective message!\n");; i& Q8 M" ^7 ~2 y8 U
        }
$ k2 ~1 Y/ c1 L6 o6 m! S! L1 n' F}: w) @  B3 h5 V. a
4 j# b0 j- J' G  t- D$ v
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: C% c4 P9 ?' e2 D5 k  ^

; Q% B2 e! w( p: C/ h% ]( Q9 c. M) W$ b  K; f( d) z  @

' ]$ E+ h& y# P6 d  C# V: e0 D+ ?4 l3 C/ t* |' S/ l1 z6 [





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