嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ( s  l5 M$ z/ w  m! I# o

$ t/ W1 W  W$ wOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 z1 H$ B* s+ s' J" ^0 C' D
#include <unistd.h>
+ D! q- ^0 }; L; `6 f; n#include <sys/mman.h>
9 R& E3 x5 e( E3 ?" J#include <sys/types.h>& I- q: V9 G8 B9 A/ N* U
#include <fcntl.h>! b# ~  K/ @) o$ m) R4 x+ E# W8 d. K

7 L6 u3 R, V2 h" I* y9 T#define SHAER_RAM_BASE_ADDR    (0x80000000)   
" z$ M- T5 P  Y% c
% y1 l* E* `$ e2 ^typedef struct
$ T0 V# o1 d+ m) }6 \7 R3 f{
9 O) X" C* y3 N, ?        unsigned int a;* C# a6 |; s8 G5 P$ C& t) {
        unsigned int b;
, C9 K. ^( F& m        unsigned int packet_cout;
7 a: _6 z$ X/ L9 k# _}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, F" c* `3 ~: z8 p1 Z( s* }8 q- B4 A9 o( O/ W8 I9 e1 B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( E0 X/ l& M; L; `# ?- p0 Punsigned int count_copy = 0;: c! q. F3 Z/ G6 M* _& P

7 M* @& ^( L; d. j$ q# `0 Y
0 e. N3 l6 E8 W$ Y4 ?  jint main()
# Z; k4 Z- `! h" e  j9 k{$ ~9 P% a1 y2 D
        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 c. |# C: D1 E8 Z/ T# z' }* I: u        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, M1 W+ E8 B9 M5 I
0 ^7 ]  ~& v7 U# H; C' r$ i
        while(1)" @- f! U0 W7 H% |# h8 ~  f
        {
# y. _1 \, ~% G( j& o4 w                read_MSG_buffer(pshreRAM);
$ s; u4 I2 ]& U1 }* L        }               
, X& x$ C/ a7 X}1 b5 P9 T, M- u5 [
& u- E  Z' ^; B/ A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 Z3 C( B7 O' `6 A0 @; {6 U
{
+ C  s! ~# O" y7 h        RX_MSG_PROTOCOL buf;
6 S" f; q3 t* @& }5 ]        2 X, c7 W  j4 ]( z2 i0 L5 `
        buf.a = pshreRAM->a;
+ W. P( U% `9 ?8 J7 h& ]' F        buf.b = pshreRAM->b;' l1 c! o0 C) ~' e7 j, k$ h
        buf.packet_cout = pshreRAM->packet_cout;/ a" C4 B4 u- |6 T2 r- g- O7 ?# F
        . X+ N" I, t5 v+ p! e& Y% ]; n
        if(buf.packet_cout != count_copy)
* P. V" h$ C) L        {
& `5 G2 z. r. R" h7 H6 I- |( W. r) k                printf("a is %d\n", buf.a);
5 Q3 _1 M9 l( |+ y                printf("b is %d\n", buf.b);
) g7 Z$ o' g8 X) @% O8 Q                printf("count is %d\n", buf.packet_cout);
# G/ n- l) `& {- {0 n                count_copy = buf.packet_cout;
# `# W; a6 t9 u$ S        }
# [3 B5 v  s) n% {6 i        else; v( o& |3 [2 u$ H
        {
0 V/ p5 Y- [7 R, `" t8 z                printf("No effective message!");5 D  Q" \) k% C; D' c& n" `
        }
% \8 p& r& H' W" n6 {; k! p3 e}
! k0 _9 n5 V) C7 }9 k3 y5 o# G
" R/ L9 i1 k, A7 B8 H) F
* {2 a8 ]2 H. @9 H. I但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! W& g' C$ E. G1 b! F使用下面代码,对内存使用了mmap函数后:
* x' u4 R9 j3 S3 [+ \#include <stdio.h>
% l8 W! h& z) S- X+ r#include <unistd.h>
, X* r$ l4 t! X. j#include <sys/mman.h>
; {+ I. X- j8 a: v; K) ^0 F#include <sys/types.h>
) b! a# K2 {) T0 Y8 Z#include <fcntl.h>6 Z8 t% R% r+ t! P- }
  F. X" B  z& D  _3 o% i
#define SHAER_RAM_BASE_ADDR    (0x80000000)
3 z4 M1 g" u) `( P/ F0 d: I#define SHAER_RAM_SIZE         (0x20000)   3 ?2 ]# ]& ?4 a; ~* T/ n0 Y  W
; p" F" x7 ]! A6 R/ _
typedef struct
- o  a$ f( D$ N/ }5 Q{
; F8 t6 R6 f8 j: z        unsigned int a;: }9 z. }9 Y8 L! [6 B
        unsigned int b;
& U( A* q- i) }/ k) x; {        unsigned int packet_cout;* q) f" w- b3 ~0 p. W0 L+ {2 E/ L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 c+ B) `; W$ ^% L2 N
4 p! U' v' ]( a0 R3 |
void read_MSG_buffer(int *baseaddr);
$ m# ~, j2 @8 U  V6 z0 P  Y4 iunsigned int count_copy = 0;" \  P, i# Q0 X, X: n
. n9 O& k# T* H' ~! O
int main()
9 v5 `1 V0 P2 y{  N2 o# W3 U. l, [+ d5 T# @
        int fd;
: \  b/ k; y. h, `5 r2 t+ I7 B$ X        int *mem = NULL;  T: k/ T# E- N% x: d; @) \
) }- l. R* s0 U- R+ U
        if((fd = open("/dev/mem", O_RDWR)) <0)
3 Q: z8 ~1 q  }; v        {% u- ~8 q2 f4 D& h7 }/ i6 z
                perror("open error");; r7 f: ~  T- v2 O  W8 ^
                return -1;
" X4 Y! i5 J9 ~8 E2 @8 G" m6 q& t# p        }) Y8 V, q% W6 Z4 W  s# o0 i* r
        $ }) T& O. P( x( j
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ I6 i" w) ^6 V& ?5 [5 ?* l

! Q0 n" }- C$ U4 F; n0 t; ]8 Y8 x$ F' m        while(1)
1 J3 j8 P9 p/ W, F7 R        {
! _# h. H4 B' V, m9 ?  |6 O& w% J                read_MSG_buffer(mem);; C; X* m5 I' J, R- m* j1 b
        }                9 u& E3 G9 H4 p1 e& W9 e/ p- ?
}+ e% G4 Y% a  V* j* m& z

$ d0 j! c& O7 u. lvoid read_MSG_buffer(int *baseaddr)- c  S2 n, ]2 q( z0 i
{
- D% w2 O: V5 W6 F, W5 S        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 U: {# ~% _! G7 O/ q8 H2 d8 i
3 G1 }, k6 h+ Z! P6 _; @/ Y        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;8 a# Y5 j/ J1 y3 a3 @( c
6 R) a8 d/ ]0 U
        if(pshreRAM->packet_cout != count_copy)
/ F  M/ d7 z# T2 x' H( O- G/ K& w        {
0 ^' d" S4 [3 ~. d0 C% L                printf("a is %d\n", pshreRAM->a);- U2 ]% y, _" \: h4 q
                printf("b is %d\n", pshreRAM->b);0 ]- p( j$ e, f6 E- Q* M; X
                printf("count is %d\n", pshreRAM->packet_cout);
& d/ C1 K; {5 d- w  E                count_copy = pshreRAM->packet_cout;
% V5 t1 F, W- M$ x        }
  T. U2 A4 R' s6 N& z1 _% ?        else
* |: W# y" s; y5 \$ D        {
: t. e7 m$ f4 g% e                printf("No effective message!\n");
- ^/ w+ t6 j; G        }( A5 ]' f  p8 h9 ?; z8 }6 }
}
# J, j- v  ^2 s. b# Y! f7 F" F3 T
. q/ T" {/ u2 h6 F* B% z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ Z4 J1 r+ Q  V" M+ L, c

" x8 v! q3 m$ D. k, o  U. N' T
  b0 _) [% x( }8 e+ ]( N# X- K# Y! o) z9 U0 A) d
7 Q; F# `6 D* F5 |





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