嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & s8 M% Q! x" W2 H4 c* J  ]% K

4 g; F. f  a4 kOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 _8 m/ c; T' _9 g4 `0 k
#include <unistd.h>) ?5 V2 f! D( Q
#include <sys/mman.h>$ v+ T* e/ C7 f+ V9 z/ h
#include <sys/types.h># C, @3 Y( O% ^9 B6 W+ @
#include <fcntl.h>$ ^* Y( u5 M0 X; O

! I7 k+ M3 [" G; V% X#define SHAER_RAM_BASE_ADDR    (0x80000000)   / ?: a4 [3 i1 l0 @8 r* U4 B
. @4 ]5 N  ]$ A
typedef struct
( s; _" J! Q$ c9 t2 U4 H5 |{: f" @# `, A0 \3 I. G
        unsigned int a;
0 ^- s. V8 ]: H2 K2 }0 q        unsigned int b;* Q/ W: _7 ]' V! i
        unsigned int packet_cout;( i* R2 {  u: a& b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; i+ b' t( ^4 _  j
! P! i' d. ]4 ~2 rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" z5 ]5 R8 C" _0 I+ }5 |unsigned int count_copy = 0;; ?+ }2 ^( ^3 P( S% ^7 l# t8 c
! m; L& E$ d# r2 h6 ~
4 t0 ]2 v/ w: ^; e- E3 Z
int main()& r0 r: L7 X* z, r+ M9 W: a6 P9 e; X9 s
{
6 p$ @3 x* ]$ }. f$ ?        pRX_MSG_PROTOCOL pshreRAM = NULL;
# \0 R8 E+ ?* V0 z, `$ N/ x% o% B2 ]        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  J5 ?8 c: |5 \! e& a
4 P6 e; g4 A6 s# E
        while(1); V/ z) J; g) |; d. @' I
        {; p( i. @! i9 X
                read_MSG_buffer(pshreRAM);4 B( X* z4 x# s+ f, {
        }                : i% w9 U/ R) B( x) F& H: G$ r$ R( z
}$ v6 c7 p0 S1 e; |8 {

, y! t. B- |' s8 @9 S; nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ F) M8 r- y+ p; Q  t( G$ C, ^{
, \" L" _+ L6 U7 G6 V# Z7 V  m3 q        RX_MSG_PROTOCOL buf;. o2 M7 n+ y8 o+ T: h
        
1 R, M; j* t5 C! T) @( I        buf.a = pshreRAM->a;
) F8 O8 h  F- w- n" a0 J        buf.b = pshreRAM->b;; N9 B1 ]1 C' x  \5 |; `! A
        buf.packet_cout = pshreRAM->packet_cout;
' \* ]4 E: E. _9 P  X        2 D+ k7 J# h" b& H
        if(buf.packet_cout != count_copy)+ M% N: Y- `: W
        {$ h5 Z: ^) v7 u  @  L& s( F+ z6 w8 g: P
                printf("a is %d\n", buf.a);
. {5 C- [+ ^% F                printf("b is %d\n", buf.b);
- W: g( r% Z. S/ i; a6 X% b3 W                printf("count is %d\n", buf.packet_cout);  F. V  s, l1 {. P% A7 Q
                count_copy = buf.packet_cout;8 |! z9 ]+ d! K( V3 k
        }
3 @) d( J' E, E! b* @* @        else
# _$ H" E6 _$ ^        {
/ r8 ?4 M; Y! q8 m2 r- ?( p                printf("No effective message!");6 L" W" z' R( I( Z' z& c7 W) x
        }
6 e4 Z* K1 s7 Q: K, r}
1 Y' R7 L- h, G' O1 y7 Q# T) s+ P4 W% [' U" w
9 }4 S; U: }  d# q7 k% q( h7 e7 f$ x
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 K' ^5 V( g+ \" f6 F
使用下面代码,对内存使用了mmap函数后:, ~2 J0 V. a4 F# M2 n. ^& R
#include <stdio.h>$ \( n- M6 _2 F" W: [
#include <unistd.h>
6 c6 r; ^3 Q% f7 a+ h#include <sys/mman.h>" ^% a1 Y- C# U4 e$ [2 \3 w
#include <sys/types.h>9 v1 r% ?2 R# O. T# m
#include <fcntl.h>
# [; ~) A/ n; Z3 E$ m3 R; A  W$ R6 W# x( y% S* P' u
#define SHAER_RAM_BASE_ADDR    (0x80000000)% u1 m& y8 y" b9 X5 j
#define SHAER_RAM_SIZE         (0x20000)   
* r3 K' G/ y2 ~! L! I' [" n& g  ^( {7 ~: M) I# V
typedef struct
, [  @% v" r  c6 N1 [6 Z- M{
, x( U( C7 R; z* @* D        unsigned int a;, E3 l3 k# w1 X' C3 N, l0 W
        unsigned int b;) L  p9 V. j5 X
        unsigned int packet_cout;
( b  O/ P) S+ J% E' P7 J. C}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 E" r/ S& I% v2 J

6 m9 }, B: f: |3 W3 ovoid read_MSG_buffer(int *baseaddr);* D) Q0 W: s8 t( M, j! L
unsigned int count_copy = 0;  R. ^7 A8 n6 }4 k

+ D& ~- u3 N" F% `int main()" U0 M4 y( h% x2 F
{* O' k: D8 H9 k: \( t* f6 \8 E4 x
        int fd;9 ^5 o+ B3 C: J
        int *mem = NULL;: s8 @6 q$ U" v' d- z6 s6 D
" c1 o# R% T+ u. b( q
        if((fd = open("/dev/mem", O_RDWR)) <0)
# E. }0 s/ z, r- ~5 t" [0 v5 N- f        {6 o: l& u1 C: }
                perror("open error");( G: s, n+ \; i4 C( ]! r* E
                return -1;8 h' O' q6 ], l: j/ U4 K
        }# Q; _, W" l7 B# a
        4 X9 }) L4 [+ z* O: g
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ I, Y( `3 ~2 j( J: q: c
5 K* C6 h4 n' m, O  x' D( e0 l        while(1)/ ^# V) z1 l3 b$ v
        {
$ m; P. L: x0 N8 B+ Z                read_MSG_buffer(mem);
2 C" f$ s) t2 L0 n. y- u! x        }                5 d2 o) k* G+ f7 P2 G1 M% P
}
/ X: ]* @6 u/ T4 G; j7 s! a
& k/ n" R: ^) o1 Tvoid read_MSG_buffer(int *baseaddr)/ V" i. @3 q2 w- |6 a0 p& u: r
{
0 r% I! Q; h% r        pRX_MSG_PROTOCOL pshreRAM = NULL;8 [! @5 D0 w9 ]1 ^8 \$ y' _

( c! |0 }4 d3 n' O9 i- `# B        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" M% y) b8 c1 {' w1 I# _: d* H0 g
        if(pshreRAM->packet_cout != count_copy)+ d9 f1 N- P1 `8 a2 _
        {
9 c+ v7 \* g5 y- q1 b/ r                printf("a is %d\n", pshreRAM->a);' d* ~( T, [/ g5 I; i
                printf("b is %d\n", pshreRAM->b);
- t) E4 I% [' U' E" H0 C; v                printf("count is %d\n", pshreRAM->packet_cout);; ]; N6 }. T9 I) k
                count_copy = pshreRAM->packet_cout;/ {2 }% O9 M# {0 f
        }
& B& I1 e7 x# ]" d' d6 L; c# W        else
2 e: m: y8 q- v3 s) w        {& G. F! [! D$ ], \6 v2 T7 V8 m8 H
                printf("No effective message!\n");  x7 h0 ?. m- a7 P" ]( g
        }' X0 e7 g. d& g0 c* b. ?
}: l# I0 h- R4 C
& `; Z% u8 F. J/ d! y) L0 V: f8 t$ E0 X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ J& B' z, X5 ?/ z
3 J( P- l  b+ t" x2 d

* ^0 _- m# P: A4 t: H+ Z9 q- C  I6 M( |: A$ w$ p, s1 }
6 w" D* x" x/ }





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