嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . t7 @' {$ C& V6 f
4 H0 m. K% Z# N  j, e  n$ k- |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& p* w3 j# I( S: a/ d. |
#include <unistd.h>" {! f! ~7 {7 G; O! I
#include <sys/mman.h>* F0 C4 g& |* B
#include <sys/types.h>
$ W" c4 a# V8 v5 l1 \/ a6 W#include <fcntl.h>% J! x6 _+ F5 E) J6 O: K
  |0 p3 k3 w- @$ i$ H3 z- A: C( j
#define SHAER_RAM_BASE_ADDR    (0x80000000)   , p9 S; ]. ?" a
, @+ y( V( J: p3 `; G/ o( }
typedef struct
/ z4 ~* f/ p3 [3 w{
; H6 [; L" {( r# Y8 j, B1 {        unsigned int a;
9 @) ]* K$ {, C  }& K. N1 G8 d        unsigned int b;9 E1 F8 L2 B7 R1 g( l# g1 k9 ^
        unsigned int packet_cout;8 h8 l3 }: E' }% S, d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 q, j7 |5 L. z8 `

1 f6 \4 M: \" H6 \3 @/ Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' v/ }2 D' ?- n
unsigned int count_copy = 0;
2 I2 p; O* ]" `( a: r- j+ t, m8 l4 L+ C3 F- I

5 P0 a5 z' U4 Y& L2 Lint main()
  G+ G* I) {  b8 W  Z; z- x7 P{9 W1 W  n" M  l* g) G, o/ a, v
        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ U, _& X) j6 `" j. a7 C" [        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 _, ^, N0 ~0 u; v

0 Y( }( X9 |1 S+ w        while(1)
; y/ ~1 |) t+ ^% l; E1 W, r        {
, B! B- v+ ^" _# D8 L$ O                read_MSG_buffer(pshreRAM);
' J; f$ [5 \' F4 Q        }                9 v$ N3 ^2 B7 R; U4 _' I; d) g
}$ u% v' w( ?% J2 z0 R

9 ]5 z/ l! T, {" e3 pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 w# q( S* w# p. x! v& Y: c. \
{
6 p# U% }, x% y" M        RX_MSG_PROTOCOL buf;
% G# Q( M* E1 q- L/ Q        0 l0 O6 s- {4 K( R
        buf.a = pshreRAM->a;- Y1 f8 ~1 `6 V0 H, ?9 f7 G
        buf.b = pshreRAM->b;2 `) M: B* [& m; m2 I
        buf.packet_cout = pshreRAM->packet_cout;
, x6 X: a. z& G0 f        
+ Z) L6 X0 X* c( N4 L5 x) w        if(buf.packet_cout != count_copy)' W: e0 L  G# n6 n5 Y" A1 I, z
        {  B1 I, Q8 a( w$ d
                printf("a is %d\n", buf.a);
( c6 }, W2 I/ W7 z, Q  V2 Y                printf("b is %d\n", buf.b);
8 ^) h: Y  Q: g$ H- R/ j                printf("count is %d\n", buf.packet_cout);
9 ?( C$ f* G2 b" P7 c9 ?                count_copy = buf.packet_cout;, \, u( h3 N- Z% `1 ?' t% s
        }
% a8 Q; I. _& j4 D, X* F        else
7 j. ]; I, }6 O" A1 K: X        {* X5 R4 d- o8 s: c
                printf("No effective message!");
  a- q2 N, V/ X2 Z3 w        }
& b3 a* S+ n3 B}3 L' u9 d+ U4 K2 z( m+ B; R0 M% b

4 \3 n$ c# ?5 m
8 e  ~' a0 j& g' O+ J但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# _$ ?5 E) t; V+ k4 @使用下面代码,对内存使用了mmap函数后:
' d7 C/ W2 X; w2 s2 v0 B#include <stdio.h>
5 n& `6 S9 ?6 T* l- [: N#include <unistd.h>
  F" x4 \" T2 g6 U' D#include <sys/mman.h>7 r8 ^* K' i( K5 f% _$ ]% [
#include <sys/types.h>) R: o8 }; z5 q! G  t$ i
#include <fcntl.h>0 S: a4 E+ P/ N3 p
' j: c+ p( p, e$ l* n
#define SHAER_RAM_BASE_ADDR    (0x80000000)7 u! e' I% x3 G2 E
#define SHAER_RAM_SIZE         (0x20000)   5 J" E4 |& B& R

5 p  ]. Z. Z- d( v% }( ^# \! j5 mtypedef struct5 q* ?7 }/ r2 f9 |% a" T$ f
{
: i! f3 ^9 C2 \) j: M- Q% o        unsigned int a;
9 }8 y! t3 f( ?4 U        unsigned int b;9 A' q6 H8 n, t. W( [
        unsigned int packet_cout;
( y& K. h. L2 Y; q% A+ Y" N3 c, T  G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% P, W7 [' g, C- z7 F% m% c+ ]

- @7 ^( e1 y! r7 S7 R5 }void read_MSG_buffer(int *baseaddr);- m$ a& o9 R. c+ S* a
unsigned int count_copy = 0;
0 x; k4 d! y6 r% ~& C4 r# X
# c% a# V" \' W+ T" C" X1 \int main()
% ~5 `8 x2 M4 z% P& a' H% m  p{
2 l" p' j0 E/ [5 M6 k        int fd;
) d9 U* ?0 E9 I# K1 V% a. a        int *mem = NULL;4 f! _: R# p+ A$ e

+ X& Q/ g' R0 ~6 \        if((fd = open("/dev/mem", O_RDWR)) <0)
9 g6 V$ w+ u" O2 A1 f        {
. d# j/ i6 ]* w9 _                perror("open error");
7 z- u6 w- M( L& y                return -1;3 z" w: N5 c0 |& T3 W: k6 d
        }/ ^: c( j' k, U( X7 r/ `
        : M. H" c; G, K4 A7 `8 ~! p
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 R  c7 U* ?& q& y4 @
. b; X8 v4 a3 v' c3 w        while(1)+ F, e/ z. u+ V" K3 ^, _
        {
0 v7 U9 P& t: w6 S/ u3 C' m                read_MSG_buffer(mem);
) I: v; Q; P. k* \/ J        }                4 J" b* p- p2 ?' P) q% Z' D# R* _9 J; G
}
7 I1 Q8 g0 e6 Z; S. b+ a
; `& p5 R4 |/ f: f" j1 X9 J/ pvoid read_MSG_buffer(int *baseaddr)
" j1 f6 C) K/ i7 P; f9 r+ q{9 s& Y+ G1 c" ?' A: e8 |, J' _
        pRX_MSG_PROTOCOL pshreRAM = NULL;
; B; i: P; V) w7 m5 G
0 q9 K$ [- Q3 l0 ~8 q2 M2 u        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* W; S: \! M3 i
# V7 F  t; |' D        if(pshreRAM->packet_cout != count_copy)
$ T. W' m9 H4 M- C% s        {
2 O# N! |: T4 R1 p6 u                printf("a is %d\n", pshreRAM->a);
2 h- n- g% t$ w+ t& Q: c                printf("b is %d\n", pshreRAM->b);
! O  k0 y1 G: Q( S+ ^                printf("count is %d\n", pshreRAM->packet_cout);
- w% z6 U  m+ ?2 v! i7 Q                count_copy = pshreRAM->packet_cout;
6 S( `- h' H* q) W        }
% F7 V0 s* c7 l        else
4 N+ M2 Z9 p* O6 u1 a        {  a8 e4 V' I9 D% y/ S2 o! N+ y
                printf("No effective message!\n");
' @7 u1 i$ |1 M5 J$ z" ?1 ]. F+ ^        }
% {; l# Z' g' c0 @2 X}1 p* @0 g+ K% l9 G! P) V1 g8 t

+ r6 J1 k) N7 x$ C. n5 r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" x, P5 o! C; \0 f* z8 W) Y" F5 d
6 J1 D* W1 L* o# [+ `3 I; b6 s' c$ K3 g! r7 `/ G% a

/ }( w2 o9 {% u2 D; n6 h
2 Y/ m4 R# |2 q' B9 X, n7 _' `9 ]




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