嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / n* r; b$ E: U

  K3 @4 u: c9 sOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: |2 ?1 T+ M3 b& H
#include <unistd.h>
+ z0 }: C3 j# M8 O! V#include <sys/mman.h>
; z4 }9 r9 q; S* i# A' |#include <sys/types.h>2 r5 T. [6 h8 a, M0 }9 i
#include <fcntl.h>
; z8 P0 h  l0 f3 M" H5 Q0 N- }
% ]' D9 O4 P, y* s0 F#define SHAER_RAM_BASE_ADDR    (0x80000000)   9 e8 ^; a  B0 K

) G# E! C* H) m+ btypedef struct
: n& Z) p! @* p. q9 ?# z{
- A$ c& s: y1 M; I2 u  C, Q        unsigned int a;5 T+ o  D: s( r( I8 W1 h
        unsigned int b;
& {6 k# k6 _) D' z9 ^" s  g        unsigned int packet_cout;
! B! N8 Q. H4 X; F6 ]: ?& U+ a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ S9 d& U" O0 R0 J6 G8 N2 S6 I# v- g  N2 X* ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 K) z/ e$ \9 c& D; U3 b
unsigned int count_copy = 0;
( P+ y8 y7 G6 ]) C8 A5 `  }# Q+ T2 h4 I/ [
4 t- W8 ^3 ?, z4 R
int main()9 g+ u9 }& `4 g6 K0 V4 `  p
{! A3 z' m. k/ c
        pRX_MSG_PROTOCOL pshreRAM = NULL;+ Q% m5 N6 X2 i1 q0 j
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; C5 I# a, e5 e9 W
* y! Q4 c! V! {) N
        while(1)
  [# ~0 H3 q4 c: j- W$ y+ C        {1 Y# H- b; p. y
                read_MSG_buffer(pshreRAM);/ j4 C: J9 k$ S, P  m- ?1 A: x
        }               
) Y( N% [' I7 E}1 d& W4 P  ^2 V: r/ P+ @
- Q7 i  p3 B1 ~; N+ y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ j, m! I* Q4 u( w
{9 |- e+ h2 _$ ]. j' Y
        RX_MSG_PROTOCOL buf;
  J5 X3 U# c! {# Z3 @        ! _) ^4 K% P2 e5 d
        buf.a = pshreRAM->a;( p; N7 n4 P& h5 t: w6 B  c/ h
        buf.b = pshreRAM->b;
* p, L) o8 |; @* P        buf.packet_cout = pshreRAM->packet_cout;
3 X7 d6 F. F" e  Z        
- [* C* @3 M8 @8 t' ?7 }        if(buf.packet_cout != count_copy)
2 j: }9 n/ d% z) f6 L        {. y. A, g# f" E$ w9 m* K
                printf("a is %d\n", buf.a);
6 J6 e) D- I8 {. l+ |. v; G                printf("b is %d\n", buf.b);% N' _+ A! Y* U5 ^. ~: x
                printf("count is %d\n", buf.packet_cout);
9 R$ x. G. z$ h9 i1 a                count_copy = buf.packet_cout;
! W3 A1 Y6 F) @, y        }
5 W4 m) F7 r, m5 i+ z" ]        else/ T$ y, n1 w! e! x4 {# N
        {" R$ Y" g' o. V* {+ P0 y
                printf("No effective message!");
1 A* e; |' ^2 a8 F1 S        }- W% {6 l( I0 c6 r! x. ]
}& Z+ N6 E) c, A! u: [

7 S# Y' [7 X" c2 t6 x5 z) n, q$ s" D" _1 X; q1 W$ f; L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% Q: n& P1 Z' O' d2 J使用下面代码,对内存使用了mmap函数后:
- T  }9 ~* K" a) `* x+ e- n#include <stdio.h>8 \( ]) Y. b: t- b8 l
#include <unistd.h>
6 A5 f8 o$ q2 i% J& Q- R, q#include <sys/mman.h>' p/ s- v& s# o6 l, p$ Q
#include <sys/types.h>5 B$ J3 K3 ?4 C, K4 y
#include <fcntl.h>
: f- B& {$ v' _) {: S
8 C2 f8 p1 d2 y5 x#define SHAER_RAM_BASE_ADDR    (0x80000000)
$ s( f2 p$ U% _% G: A- l& ?3 U#define SHAER_RAM_SIZE         (0x20000)   
7 o( A% b( N5 J: I+ y0 c/ k; b3 S. T( I+ X) W- {# ]' t
typedef struct
1 G3 X3 P# a; F  _/ E  P) G) F{
9 a; A+ S! E, U2 U: M$ k        unsigned int a;
& _/ O0 ?! e# q        unsigned int b;
2 ?( b0 H, ~) b- t% O, y- z        unsigned int packet_cout;: F' B- [+ d  \9 \2 r0 h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& t- Q' P% d# `" i; H3 f) h
* K2 k1 f1 }' y( ?! v) z( p
void read_MSG_buffer(int *baseaddr);: U" z  j! b; C' R5 n0 U
unsigned int count_copy = 0;
, P; i3 C1 D5 W0 b. Q% x: t! O% W& O2 ?. L- ?1 P& q. U7 d
int main()' {0 Y  x* J/ m0 s
{; {# k/ \) P- m; l: b
        int fd;
4 g- I5 m4 T% I        int *mem = NULL;! g8 H, j4 r' T4 w* B

6 m' y5 f9 e' h/ u/ |- r: d        if((fd = open("/dev/mem", O_RDWR)) <0): _# _6 K1 L( d0 V
        {
0 d2 R7 e2 e0 U" f  I4 U. Y  S                perror("open error");0 ?7 E, A9 u- h$ s+ i; H( f) F0 R
                return -1;
. r) V# A* L& C        }
. O6 q% U9 f( Z' k9 M        " u% t1 G/ X* f6 |7 n$ I
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);. c6 E) i( g1 z7 u0 w& ^3 {

* u7 M! W7 D. H8 x6 Z/ v1 H        while(1)
$ i) j2 ]* x6 K) u1 Y" l% d* J        {) S; l; L2 {, o+ [) L: E
                read_MSG_buffer(mem);) @9 r8 c( P" F4 {! g3 R
        }               
6 I' U# a' f* Z  O}) ]& m7 ]- T9 \

( _, V8 I& G9 n: n- Uvoid read_MSG_buffer(int *baseaddr)
+ K+ S3 f$ ?2 u* m* q{
; q1 r4 ]5 G& P8 Z; S        pRX_MSG_PROTOCOL pshreRAM = NULL;9 y0 p' n0 c9 \+ [5 X

# V3 {4 z* L9 L6 i6 X3 v9 {        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% W0 L) r3 `6 L8 m! c
  H4 _7 V; L- m/ T( R( ~        if(pshreRAM->packet_cout != count_copy)
3 d. s9 ~  |; s% e3 Y, ~        {' m. U  H9 _- @' `8 j. @" p
                printf("a is %d\n", pshreRAM->a);
; v4 b. t/ q% c& E                printf("b is %d\n", pshreRAM->b);
6 [9 P6 g; U! n& d+ s- F- [8 F2 M                printf("count is %d\n", pshreRAM->packet_cout);+ E  U( P+ U/ U
                count_copy = pshreRAM->packet_cout;
7 U" q/ Y% Q) w0 q) s5 U- s/ I+ w/ a        }. B3 w. ?4 A7 `! ^
        else, p# X) s* R* R% c+ M, D
        {, i2 n, H: e  J  n# _* s
                printf("No effective message!\n");
0 n) B- l/ H+ J( Q  H        }
! C% H( W8 ^. S' Y" \+ [( l}( H' W; K  t7 L4 a: n- Z" I8 b

/ ?) |5 c, Z: X) _  ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 W3 m. g4 Z1 F! ~- j$ W6 M
- V, y- h4 o$ d- W, n
& v+ \! r/ P. o% L0 H' k
' }+ @* ^* M# D% {9 U; f& Y" ?
/ ~' N/ m8 h; ~# F1 D7 O6 V; g




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