嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
$ m: |5 o; Y) t4 e0 O& P. K! C& c8 X$ P/ Q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 `, l8 a& L4 v2 {#include <unistd.h>
7 M4 [2 Q+ k, C/ m- Q% h#include <sys/mman.h>
% C7 o* U+ O0 o! [8 J2 Y( _' J#include <sys/types.h>* G) m  c  y* r9 F
#include <fcntl.h>  W- Y5 p* N$ Q  y, p

# x7 h( y8 U) q* h$ I$ A#define SHAER_RAM_BASE_ADDR    (0x80000000)   6 l, I) h( e0 @) r
4 Y- L7 V4 f6 C2 Z
typedef struct1 E4 E1 g9 \2 x0 T7 i' h
{" C+ T. u; I% P# g+ N
        unsigned int a;
7 ^, J. r: `* _/ B* H) I        unsigned int b;# t% t* N1 ^; G( W
        unsigned int packet_cout;
$ e( B  H, ]: J" l* V% H# k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  E+ B5 i8 d1 V# q; l

# Z- z# _2 A1 X0 Q! b# s0 jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 X2 b* z! l) Q9 C6 I
unsigned int count_copy = 0;
/ O$ l: Q! I4 ?, S3 g! }! b0 K3 U! \  F' a6 d: b3 n( q
  Y9 N  C0 p$ j' @  |! K# A6 U1 h
int main()8 R; l  L4 V: q; Z& {( e" M1 A8 i
{
" V* c, h; T( F6 n! m        pRX_MSG_PROTOCOL pshreRAM = NULL;( v  ?  ~& i, b
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# @+ Y! v+ J# b" r

- w$ }5 I1 h1 s9 f9 z- a        while(1)- ?+ f) d& N. `9 e
        {
0 G( M" f7 y2 u; H; }                read_MSG_buffer(pshreRAM);
) f2 T1 ]& X& Y: G  A        }               
+ B7 e6 n0 e: u- r: V: J}" Y; i2 T# ?$ Z! u) R( k
+ C. [/ |) j9 B1 J: G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- y7 B3 r. d5 Z4 Y0 I* L$ u$ g{' g# e! c0 ~6 X7 E' s: v- l# i2 k; ?
        RX_MSG_PROTOCOL buf;
* S9 E9 H" Y/ w# Z" K        
. Z* z$ G# z2 R. S/ {/ J; n        buf.a = pshreRAM->a;5 b: K8 y6 n, ?
        buf.b = pshreRAM->b;
6 }: f0 u, J/ ~* I8 U$ W* b& d        buf.packet_cout = pshreRAM->packet_cout;
. e; Q3 h& d: b7 p9 Q2 Q8 u        
3 X# W% a( m% n+ b  u+ h& Q% J        if(buf.packet_cout != count_copy)6 G! \  x- `) s7 Q  W
        {, R  x) v$ Y# R8 h9 g7 h
                printf("a is %d\n", buf.a);
( S. ~; w) J: B8 [  x                printf("b is %d\n", buf.b);3 ]; z' @9 }5 k4 x" k) A8 ]
                printf("count is %d\n", buf.packet_cout);
0 \0 |" ~! X( K7 O: D: D                count_copy = buf.packet_cout;; u9 t1 |' L: D, P4 p; f$ I- v
        }
' Q4 {- m2 a+ v4 X        else
! f0 r- d& S5 c& h! s* A        {
% Q, r, T4 D* C" \; l2 ?                printf("No effective message!");
+ \+ [0 K4 s  h" e0 {* Q& Y3 w8 b' W7 D        }
: E1 W" v1 i5 w2 ]}
3 J  x6 r1 G5 f. X1 M9 J. F* }( r7 g' J
7 j: J! [; h( |5 Q$ l, D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。  p! T6 }* J: m9 t: ^: U; _& \
使用下面代码,对内存使用了mmap函数后:
' u  O6 ?" W) N#include <stdio.h>
; a) j. t' O( `+ ^3 K#include <unistd.h>
3 L' e& R! M" S- T, w- o, m3 t' I. S. I& d#include <sys/mman.h>
7 T/ S6 T, I' V1 G#include <sys/types.h>
4 d: u. w2 E( J* Z7 i. f1 k  o#include <fcntl.h>
/ a1 R, T, l: S: z4 C  {) M  M. H8 ?; f) ~% D6 P
#define SHAER_RAM_BASE_ADDR    (0x80000000)( ]4 B) ~: o9 |: m
#define SHAER_RAM_SIZE         (0x20000)   2 p# G$ N1 l7 R4 m3 \4 q% b8 H5 \

; E) P+ q4 F$ v( r" }( L: R5 btypedef struct. W- M. V: B  e
{
8 |0 g; t4 z9 Q. W4 X0 Y        unsigned int a;% N% C, ]  V( ^9 I1 n* V- X. {
        unsigned int b;
  |6 A4 W9 x3 l8 }0 l) A/ |        unsigned int packet_cout;) u& _* \" Z/ _! ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 Q7 U* n  _# o- T/ V
  L. P" z; u3 n/ p1 m1 z
void read_MSG_buffer(int *baseaddr);: Z3 n  O. Y2 `' ^* D" I
unsigned int count_copy = 0;
+ T  K' y  d: Q9 K6 j: y: t- J* k8 K# v) j, i* i: w. G' y* x6 G
int main()* I) H8 Y! W. D9 u' r; g3 T( m
{
  z7 L, \- B5 G, T        int fd;
& x4 Q. P6 i; U: C        int *mem = NULL;, J7 m9 z' [+ C4 S# m

/ j+ }, [* U, @5 A8 |' n. L        if((fd = open("/dev/mem", O_RDWR)) <0)
, C* w: N- x; |7 ^8 S; b        {6 U8 a/ m. N# p. P" ]- N0 U
                perror("open error");. t7 p5 `2 b) o9 o9 X
                return -1;
& f6 b+ ?, k8 }: b# h        }
% q6 o4 I; K1 e# b3 S6 Y1 L8 P        1 J3 |  i8 p5 h# V( s7 @
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 H6 L, R% x; ^+ S
6 T0 D" q6 Z& A4 J$ ?, g8 o
        while(1)9 S5 t) d+ @6 V: O
        {
  f" e" X# g5 q: k3 e& I( c                read_MSG_buffer(mem);! b  m# o& |1 E
        }               
; p$ F1 q) m7 r1 _7 D; k8 M}2 P1 D" ~. ?7 K! U: \5 m3 B

) e2 a. K& U! j& h$ D, nvoid read_MSG_buffer(int *baseaddr)
% J0 a- t8 h: d$ m7 p8 \6 W{6 b% ]2 o2 z! N4 Y* u' s
        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ }1 D6 l) n: m% h$ z, T/ D& \2 K: E) O, n  g8 e
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ [7 Q- Y, N8 \7 ^+ n- r6 o
8 S% M* H  W( e8 {& c, ?% @# R
        if(pshreRAM->packet_cout != count_copy)* P4 }! L. @: R
        {
8 }0 E& H9 q0 V                printf("a is %d\n", pshreRAM->a);% o7 v# x1 B9 E3 F
                printf("b is %d\n", pshreRAM->b);/ ^  C7 g1 h) C. S3 @8 z
                printf("count is %d\n", pshreRAM->packet_cout);
- {( [. D( K( v) ?% _6 z6 {: C                count_copy = pshreRAM->packet_cout;
  `  ]' `1 F! q1 N$ f0 `        }7 }1 h0 `5 }: k) W
        else. ^( l; m1 o$ n( Q% ]: k
        {
2 u1 i" V$ N+ u- n$ I! G. L8 J                printf("No effective message!\n");
9 z9 k$ [# n$ N9 r. g! L        }
! L; r" c; e4 }' N( D/ G: V' v1 ~+ ]}
1 u2 F! O9 k+ z) s7 Y  u8 v" C, r; y$ v- ^, M" u
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 t) k* O9 z0 w; G3 u
! t( _+ I7 D5 H/ @' Y# L9 r% C: Y! O2 `
, `, Q' R) H/ m# K9 d

" z! q8 Q! {8 Y' A




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