嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + a! C' Z. t% w+ k

# o: _  y4 E. ^7 [' v5 BOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& o7 [  X& Y6 }" i
#include <unistd.h>3 x: m( D! Z; W: A' U. J
#include <sys/mman.h>
7 w8 D0 e- w3 F9 |' m#include <sys/types.h>1 b$ |4 W. I& [* }! g, G" c2 [
#include <fcntl.h>* @1 H2 [( p- h; o2 v, f

0 W/ U0 x/ K: j$ U4 O#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* ^$ z. @1 @5 {% |- E
4 w+ r4 V% s+ {1 ^8 Utypedef struct
- }- B4 d" s, A, @+ f; f: O{2 E1 s2 H0 ~) @- |* M' j
        unsigned int a;
/ l8 e" j! T& x- o* a        unsigned int b;! b) X: t6 {( T# A5 n. r
        unsigned int packet_cout;
3 E: ^1 I% S, h7 ~$ h" g5 a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& ]# _# ]9 d9 @# o9 f. y
- c, z, a; Z2 `0 S3 W# p; b' c( O) s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);  p, @7 ~# ~* }4 M, W, f
unsigned int count_copy = 0;
* y4 h$ v  {9 d. ^5 N; J) }7 }, l! K/ S9 H9 g# k

$ o) w8 r& I/ N9 S8 n( S: Nint main()
$ @% B! {9 l% j) a, ~: G{
0 x, R* e9 s& i        pRX_MSG_PROTOCOL pshreRAM = NULL;9 t3 j* |/ p& U; W7 N$ t
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;5 b; q$ p& S- o3 c- [0 @
5 t$ C, w3 m9 D# N
        while(1)0 I$ C2 G, m! R" A2 o
        {
( D! ~& Y: o* [                read_MSG_buffer(pshreRAM);- @, `3 Q0 s6 E' i! _# }
        }                & S, ?# Y$ f0 d4 r0 ~
}
. ?6 z! H- F* m( w& d& w  O% L/ A, {6 p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ r! D4 q$ `3 C2 U% c{
: k8 N! [4 ^* s7 s0 B' X        RX_MSG_PROTOCOL buf;
. X/ T4 G' w4 G* O+ B5 \        
* F3 o2 n3 G9 m; F$ q( p5 e        buf.a = pshreRAM->a;
& R: [' q2 {. f# p8 X0 c        buf.b = pshreRAM->b;; b7 g; Q/ a" q8 S
        buf.packet_cout = pshreRAM->packet_cout;% u4 O- ~9 f. c" ?" J5 u- Y
        
+ L* F5 b- j7 z6 _3 K        if(buf.packet_cout != count_copy)# i! w' ?# p" Q1 s. Z* M; s# w
        {% E$ O7 |5 U" D, }' m* J: M- F. O  u
                printf("a is %d\n", buf.a);# s6 [$ z* Q+ z) n
                printf("b is %d\n", buf.b);7 A+ [( D! Y9 q4 Y7 Q
                printf("count is %d\n", buf.packet_cout);
+ ^0 T7 N- ]4 x5 j                count_copy = buf.packet_cout;$ G( e1 S6 n4 @  R: O8 p8 u5 ]/ G
        }
7 O! L: ~2 y% m' d& z        else
& i- W# L9 s3 n! J( Q        {
% s! P7 c. G' ~+ O/ o* k  o! k                printf("No effective message!");
. R" O0 E! j9 f9 Z; ~        }
' E# r  B& O" q- Z) u9 w}. S8 s' y/ _# L/ M: f2 i) k4 R

" E  }. Y' ?6 @2 ]1 Q. b* P" A! d3 R0 F3 I; |4 V
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 x- H- {: S/ H- A0 A( A使用下面代码,对内存使用了mmap函数后:& ^  R; r" G, y8 o$ o& d1 s+ i2 K
#include <stdio.h>8 Q' H( n$ j8 z7 u) n" b
#include <unistd.h>" B+ \" E- {$ _/ o0 |( L4 r& ?
#include <sys/mman.h>( C" v- c( g& m* U
#include <sys/types.h>. v$ I' q4 Z* i! G; d
#include <fcntl.h>5 ^$ y7 u0 l9 t% d* d8 j- T
* j7 m% G2 k2 ?( L+ L& D0 Z
#define SHAER_RAM_BASE_ADDR    (0x80000000)3 E! r* Y# Q7 K' n4 K
#define SHAER_RAM_SIZE         (0x20000)   
% V( n/ m% e6 N# u' |; k4 o4 p
4 I" ~5 d- s  u! r  z8 Etypedef struct
9 P7 N& c. E9 L2 e  c, M{/ |1 D9 z/ F$ l4 e# z. U! M" n. K
        unsigned int a;
& Q/ X8 A1 v0 U8 z1 ^( p9 d        unsigned int b;
4 v3 d7 n) j9 Q$ M        unsigned int packet_cout;
) g( q7 b, {% a$ x& T; f% t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: ^. ?1 q2 f3 l% o8 [3 K# {1 ?

0 @9 v. ], `! S+ E0 Q- {5 rvoid read_MSG_buffer(int *baseaddr);
' U) w: }. I" n9 ^9 \  v+ aunsigned int count_copy = 0;3 s& C& v. u% i3 ], [

8 F# ~, s: x7 b$ Dint main()
# O+ a4 R6 n) Z% Y5 }7 @{% o2 \, t- h/ v4 m
        int fd;- W6 L0 A" l# o4 ^* h4 k- B6 l! k
        int *mem = NULL;
3 a6 f. X6 o$ V+ p3 b$ [7 S' s
& `2 ~  @+ E* C' G, u        if((fd = open("/dev/mem", O_RDWR)) <0)+ O* k0 T5 N) x% B' h
        {. v/ j! o% F! t4 T. w- m9 l3 Z2 J" H
                perror("open error");' x6 E, H& L" x) f
                return -1;
7 W$ e3 v$ z& @$ T        }
7 [3 O+ x# |7 R  a; p: p  o        ' {7 P5 c2 V' u& ~  V& r
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 H% D$ v8 X0 d) z) F4 H7 f) B
. Q7 y; T( B9 X( S4 @( @4 l
        while(1)) f3 T$ r' v9 r0 ^. @  ?9 V3 Q
        {; u# {# \7 X9 {7 @9 w
                read_MSG_buffer(mem);2 Q5 V7 x- A# S1 w$ o4 Q( \) X' K
        }               
0 c1 c& C+ m* `. ?0 T}" V; L* J) |( o% N- Z' t6 g3 ~
- ]% P# A+ ^4 Z; A8 k( m
void read_MSG_buffer(int *baseaddr)
3 I% X, Z8 T2 ?/ `3 |{
, U* e% o9 N8 }/ W        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 p% s: ~6 K. F: b, [2 d6 H& {* A
( C# X% u9 e) g+ T        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* |- ^( E# [" f/ h- E: v4 Q; W) ?5 I, q" o2 G7 w
        if(pshreRAM->packet_cout != count_copy)
- Z8 t+ B& e3 h, I# I. p! C        {  `8 k9 t/ |, l6 g. j0 j
                printf("a is %d\n", pshreRAM->a);
' O. T" P# r0 z, P                printf("b is %d\n", pshreRAM->b);
6 x& S/ L" u! w: V. F9 I. j, i                printf("count is %d\n", pshreRAM->packet_cout);8 Z$ T8 J' i' `
                count_copy = pshreRAM->packet_cout;
" L$ n3 d+ `* Z& U0 ~3 `; C5 |% N$ c        }
2 f  h" J7 h- R; Z        else0 k6 q6 S3 O  a1 O, ^
        {7 T) m. n- s) v, k) E6 Q
                printf("No effective message!\n");
8 V1 x# I5 T# Q' ^5 ]; Y' k        }+ Q$ d6 J+ c+ I* ~1 q
}& x2 k4 s% J/ K* w
: D% y% o, \. r. V
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: E8 q$ a6 S: P# q7 k

1 v( t3 n  W6 Y: N% g
2 N/ m0 ]2 p2 I5 v1 ?5 l
7 U; n6 ]1 @9 b  W( M
' n8 ?% b! u' c0 e5 F% |




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