嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) ], b; u3 b% n( Y6 N0 o7 |2 Q* b
- k; K, Z& Y; d6 S. l, QOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>4 Y2 ?, t' U1 G; x0 H* @3 e
#include <unistd.h>. J1 I5 ~4 \1 Q  f* r+ k/ I
#include <sys/mman.h>
: n9 Z( n+ k6 Q! [% L#include <sys/types.h>- ~) C+ z0 [9 t, {. s! g0 T+ O# \9 q
#include <fcntl.h>
# T: N+ F2 O, G2 M* ~* D% m" n7 ~9 U, t2 M& r4 |
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
7 M7 D/ c3 L/ e" q- k/ y0 m) I" ?; x6 s( W& O5 C  S( m: z
typedef struct& r% W/ K' M  ^8 R% s
{6 K7 m! O- w+ q
        unsigned int a;- p; }3 |2 s; G) |% Z, s
        unsigned int b;5 M$ |" ]+ q! Z- Q& A1 ?" V
        unsigned int packet_cout;
/ N- q: l; }  d+ [}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( s, t0 q0 q% S1 t* Z! r7 b: L3 x* ?2 J7 T0 Z' t# W" A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 y/ Z0 _+ O3 u" G0 Wunsigned int count_copy = 0;0 d+ w/ e) ?4 U3 r; a  t8 W/ M) ]0 c
7 p- U) m$ x1 o- ], e6 h
- k, l- G2 D) c
int main(): [* P& u9 b2 z5 i( @; l9 f: i7 b
{
% Z/ A. M0 H) W8 t5 L# Z  F        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 a5 _; F" e1 i0 o3 M; l        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" E3 `: u% h  N( [* S! j
9 d3 r0 i9 q+ f8 ~        while(1)
* o" D4 A( C. ]/ k% ~  h" n: w        {4 o5 m6 @8 A9 E
                read_MSG_buffer(pshreRAM);
3 j6 D  [' _& p6 G% B$ x        }               
" Q" I8 O. R' P/ y& p}
$ s4 S9 d4 o% b, d' E1 y2 B+ w: R& G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* }$ K; B. M9 L& ]3 C, i{3 A6 U$ d4 M! V4 }2 I
        RX_MSG_PROTOCOL buf;1 b& N5 v. y( `  i% s7 t. |7 O: T
        
' ^1 I/ M5 A/ N# @& D% N0 ~        buf.a = pshreRAM->a;- G1 e% T/ Q# N7 P8 R1 R5 |5 j
        buf.b = pshreRAM->b;
4 B$ m9 e8 o* ^; _0 z        buf.packet_cout = pshreRAM->packet_cout;
; e/ K' s1 T) p- O$ Z          N& D2 W6 p5 c1 ?5 ?
        if(buf.packet_cout != count_copy)
% e5 g1 J" r& V. o3 G        {
1 z  K9 w6 T5 O8 Q' ?                printf("a is %d\n", buf.a);. r: |) x% a7 \& G
                printf("b is %d\n", buf.b);
2 d) E+ Y/ C) j9 V( E                printf("count is %d\n", buf.packet_cout);7 C$ E/ m* A4 u
                count_copy = buf.packet_cout;; P* U6 ^+ a" z9 D, p
        }
% t& J/ @* u: P1 d        else  l0 F! i" o. L  ~4 l+ [
        {
8 P% _$ _  G, K; Y                printf("No effective message!");* S6 O$ f  f+ [# S
        }
/ c. ^/ J4 J0 G, P; b}5 @' h/ b7 T9 g+ ^# d. o2 ]
- h* G- c0 u2 `- F( E" V1 K# I6 l6 j
  p* l, {/ k4 @% J
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 w2 V; p! H; c2 _: n使用下面代码,对内存使用了mmap函数后:
2 W( x1 Q/ a4 T+ Q+ S#include <stdio.h>
, r0 [1 W' [: q; x0 x. q! h& H#include <unistd.h>1 C8 `4 A. e  }; J" }: z
#include <sys/mman.h>; m* Z  n; q  Q$ M* z2 ~& Z
#include <sys/types.h>& [1 h& F% e2 G6 N( J
#include <fcntl.h>
* X+ P& g2 A& R2 c8 Z9 @6 ]6 X6 l; t5 C! J+ u3 P: E2 |$ ?
#define SHAER_RAM_BASE_ADDR    (0x80000000)/ ]0 x# V, `) [& E: s
#define SHAER_RAM_SIZE         (0x20000)     ?5 F" A% }, r2 c* |, g. G

/ k, }& G" ?0 e$ }typedef struct
, T, p0 b) }& t2 `# x# `6 A{: ~! N: |' O) _5 o" H
        unsigned int a;
! Y6 E' i1 c2 J0 Z' t        unsigned int b;
$ d! ^& U& T7 r        unsigned int packet_cout;
; i& R1 Y; M/ m! A: I7 z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- E$ v3 U8 @4 @6 ^0 ~7 _. m" h( w& X9 }: l6 E
void read_MSG_buffer(int *baseaddr);
. @9 O4 P5 K, ]; O( t% q. ?unsigned int count_copy = 0;
5 x2 K1 Q. s8 d0 u1 B, y. Y4 ]( c# N) r& p0 [( x' z
int main()9 E7 C: |) T0 K/ A
{6 B0 D) x$ U& e, K! C- R
        int fd;  y" C5 [/ H* i5 g) I
        int *mem = NULL;/ v  x) r$ T+ j9 [5 S+ y& {( B, J

, c7 a$ f5 ]# e! h$ ]7 X( X3 A6 Q        if((fd = open("/dev/mem", O_RDWR)) <0)/ X4 P0 B6 E5 O9 W/ d
        {
' K/ c) Q. [& p7 y1 B  G                perror("open error");
( D: A; b; p' K& T8 r0 J0 \4 |8 Y                return -1;- T/ ~4 m0 F- K$ l
        }
& c; x: R; K) k        + {2 Y7 J( Z# A9 f3 S. k
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; H  h% e9 F0 `" |& Z' [

* j4 T. `- I/ w$ P        while(1)
7 {, o  ?% H/ B        {
5 f* [% Z! s+ M% U. y0 E4 P! ]  l                read_MSG_buffer(mem);
) ~+ [4 X6 T) g* s        }               
7 w; v5 l3 }6 l) t}" e4 j: T& n( f5 D1 p- s

$ e+ k% O) H" J3 L4 Ovoid read_MSG_buffer(int *baseaddr)
, M3 ~1 i7 u& k{
- X+ f$ D0 s% f* i0 f        pRX_MSG_PROTOCOL pshreRAM = NULL;* c5 r/ h$ Y0 J4 `8 m+ X+ _
8 D# {/ w; Z! ^, E0 r" a7 B
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  o' F8 b/ W0 e) X* {
( k4 d1 s+ i- H: X        if(pshreRAM->packet_cout != count_copy)& }* N* l; {  a9 b/ |
        {
% b% B+ U* V4 n. H, v                printf("a is %d\n", pshreRAM->a);. _- a2 c$ Q1 Y" ?1 R4 ]/ [
                printf("b is %d\n", pshreRAM->b);
' F0 D+ d# ~$ {+ R2 N; w. e                printf("count is %d\n", pshreRAM->packet_cout);( h1 Z% Z: s# t) U- A: S
                count_copy = pshreRAM->packet_cout;
* D) e1 ~; u+ \        }, R0 _6 _: @. @+ o# s
        else
4 }: }, \0 }0 z% \3 N! q9 x        {
9 N- h; f$ _3 _% A5 J                printf("No effective message!\n");2 C. N, V1 N5 K; ?; z
        }
7 n! D1 ^- {; [7 y$ D/ ?}, @' _+ A  B7 ?
; F" j$ K$ |3 P* r. s/ B) V# q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& T& w; k( J; L" Q5 r
* X; N2 T, S. U3 n8 f# W0 F$ Z6 j0 E9 f0 _: q3 J8 \( |9 @

% @' B+ h: }8 R$ m  `" n& O/ v( t" A+ n* U4 O9 b/ X5 L: t) z" _! {





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