嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , T, S2 V1 W- C3 i9 l+ n2 N& l& D0 J
2 U$ Z- b9 _4 g! Z% l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 @& v/ [$ |$ R% y0 v: g
#include <unistd.h>
& I; \2 p' ?6 o" K#include <sys/mman.h>
) N, V3 i- p# s6 q  Y9 E( }- ], D' V#include <sys/types.h>* A3 B. V9 p2 }* U% Z
#include <fcntl.h>
3 C; S  B: g) x1 K7 D) T% B+ Y1 Z1 R
#define SHAER_RAM_BASE_ADDR    (0x80000000)   9 Q/ H7 P. y  S* ^- o2 X. P
* ^2 ?' x  {' r  n* {2 H
typedef struct
% I5 r, L* o& p0 L& G2 \4 i6 ^+ T{
1 x1 J! p; y/ ?: u8 S, U7 z: |        unsigned int a;# [7 _: X2 M4 v. C/ V! r
        unsigned int b;# A; L9 w$ J7 P7 [
        unsigned int packet_cout;" }4 k: R2 W7 K' R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; B+ W" q. s9 C# z! D% O3 x- x0 u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);  f! Y' E4 r) r, w
unsigned int count_copy = 0;
7 s, o  g/ |' n, y+ E* j$ z- ]$ M4 x

. [9 U+ U# ]% L5 S2 ]4 E% sint main()& |3 L# d: |, v3 c
{9 Q8 L! C9 o" K' x
        pRX_MSG_PROTOCOL pshreRAM = NULL;0 u0 O4 ~( J& r- a' K& D
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( i" K4 g9 l. ^7 k3 M* N% X
: U3 w+ `4 e$ e/ i: G4 L
        while(1)5 Q0 M( I4 D: u9 ~
        {
+ d5 M; {! q0 U& n, N3 K                read_MSG_buffer(pshreRAM);
+ z; q6 j% n: L1 I6 r& |        }               
. t% E4 K' a  v+ f" @& e8 Q0 }}
" j  F! d' e: W2 X  Q( q$ k9 a$ c1 k3 Z0 q7 ~0 ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 j3 B2 {; {3 I, Y9 x) {4 T0 c{
* ?: w! N' e: O  q  z        RX_MSG_PROTOCOL buf;7 m+ L( K: U/ I, t6 {5 h- F6 b# ~
        
7 F1 T2 \' x3 Z" V$ c4 ]/ o3 {+ e        buf.a = pshreRAM->a;
: l: X! v( M" \. G" J, E        buf.b = pshreRAM->b;( j! G% l9 M0 H  ?6 L1 {4 a
        buf.packet_cout = pshreRAM->packet_cout;1 t+ X6 A, h' o& }8 J7 [6 \
        
: `+ O: k$ I* p1 o0 b/ ]5 E) L; }        if(buf.packet_cout != count_copy)
' U- n" s3 V% W% I5 s" n        {/ R* k5 [' g4 S9 K" C
                printf("a is %d\n", buf.a);
  }8 Y1 a: c) \# a2 o5 _  v                printf("b is %d\n", buf.b);
2 @8 l+ K) x& A5 Y( m                printf("count is %d\n", buf.packet_cout);% m2 ?1 {6 q& r* d+ O5 v% }( a
                count_copy = buf.packet_cout;
7 G& C% U& }' @( Y4 U% ~        }
" W+ a3 \, Q$ H: t        else" X3 Z$ S) Q+ ]0 W
        {% Y, n( b) B! o4 J
                printf("No effective message!");
& V7 `! W( l# p1 Y        }3 z/ {! S# s1 x/ W. ^: ~3 P
}
3 e; R1 E( y# z5 I4 N1 T! g! ?/ P0 b- G# x7 H3 W6 I
! R, e( `3 i1 {2 E4 [$ S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; N( u6 D( E( X, b使用下面代码,对内存使用了mmap函数后:% f4 }) T) _1 L
#include <stdio.h># D8 Y% P6 N. p- c% y! i# }
#include <unistd.h>& k1 q; ^5 T# S# G
#include <sys/mman.h>. q+ l; t" y+ o5 n+ ]
#include <sys/types.h>
5 l# |" |6 A% g; Z: \' b" q#include <fcntl.h>6 h& o0 q. V% G" l' B+ Z4 I5 K" i* t
( \  a" g% p. X  C# w2 Y" {
#define SHAER_RAM_BASE_ADDR    (0x80000000)2 \5 ~1 V' {5 X5 H( o" J, y
#define SHAER_RAM_SIZE         (0x20000)   % C8 }% ~  Y/ M5 u$ ^/ I

. [7 b& g) d1 |3 [# T5 u; n& ptypedef struct
1 C- G+ v+ q% [8 i8 A9 ]% r{
) d8 \' t2 G% F        unsigned int a;
& V5 C: m( Z) k( _) g, Y: i        unsigned int b;- A) P3 \" \, K9 G* p
        unsigned int packet_cout;
  Q. }3 L3 K) c. c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 d8 C, u* F0 i: [  D
& X8 _& m6 G2 z8 qvoid read_MSG_buffer(int *baseaddr);9 x1 M7 W5 H- z
unsigned int count_copy = 0;4 ?" q2 C) Y3 V/ L6 g+ a; ~, x- [

6 j% x+ J. K. q! q; lint main()
# _& X3 n# o6 q# n' d" Z{* V7 R1 |2 r4 E) R0 Y; m
        int fd;' ?- W  a* o- v0 v
        int *mem = NULL;7 J) j8 i8 g: A$ u+ N' Y, m2 ^
7 I; E* \" g! `* o9 N" e! T
        if((fd = open("/dev/mem", O_RDWR)) <0). B  R5 q1 d3 a0 k" X9 ~8 k+ v
        {. T* ?) O: o! L7 [
                perror("open error");
$ }* l1 ^5 l( `+ F7 M; {                return -1;
9 B, ?4 N. f/ I& y# W  X# b        }
+ E3 j# b) E: L0 e3 `8 k# P- }% j' W1 ^        ) K* E0 a+ @' n% u
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* i9 h1 i/ M( \8 A! w2 f* o6 |5 q. O8 i( _6 h
        while(1)
2 S, i9 A& I: |* i0 y4 [        {
1 r# B+ L) ^- {5 ~  s! u                read_MSG_buffer(mem);
0 X) g% l1 t; J        }               
* Q+ @  b. u4 c9 O}6 D& s+ Z8 u2 j+ n
' G9 V0 \1 M6 X' A
void read_MSG_buffer(int *baseaddr)& K, y3 k7 ]/ u4 t" s$ i
{/ T3 u- e6 w4 b' D" s6 O3 Z# Z* L
        pRX_MSG_PROTOCOL pshreRAM = NULL;. Y  E6 {0 X8 S* X, t* Y
9 B$ W- v" R6 A+ V- k
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 D+ h. ~3 `: S; j6 J

# i% n: f: P7 |        if(pshreRAM->packet_cout != count_copy)  @& _" G( Y2 n" I
        {7 j" p- ]0 S. x- Y; X0 x  [
                printf("a is %d\n", pshreRAM->a);! @/ J1 H( ]0 l
                printf("b is %d\n", pshreRAM->b);# D6 L# F- }2 _% j2 D  z4 }
                printf("count is %d\n", pshreRAM->packet_cout);- ^2 `( J# B. p$ m
                count_copy = pshreRAM->packet_cout;
$ n; c, X2 L4 s5 B" I        }
- |0 z: r" {0 [0 D! n        else
2 N+ l( p2 ~, i2 _        {
) V6 t4 m! G! n0 M                printf("No effective message!\n");
" w( G4 w$ t# W        }0 n% c& U" }4 v" b, B. W' w
}
7 n4 q! r# ?  @6 i
3 Z7 o) h. J, m/ @没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 n! u# q7 _4 |% W% \8 o

+ R8 H$ L) A+ q" k1 {3 ?) x) ^* \8 {& Q
2 n3 [8 P( Y* l8 h- e/ r
/ B8 I) v- K1 M





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