嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 U( m9 q. g8 t9 ~
1 d1 m% M# {$ _+ W4 t
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: u8 _1 `) ?# ]$ l
#include <unistd.h>
  ~/ J. G5 |. `' N2 E+ P#include <sys/mman.h>, R4 n! ]2 |6 V! R, i
#include <sys/types.h>
2 [- E" \% G4 b$ V6 v9 l! G#include <fcntl.h>
* R& e- n1 l# |7 n. k9 _' Z9 R  F* B# ]# ~2 H$ l
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
8 I0 E9 ~/ B: ^& O  N+ r9 u5 x
9 T" z; H* R2 H; v0 m/ F% dtypedef struct  K: R$ v! g6 \! v: `9 n8 c
{) j3 Q0 E5 D4 W* y( C/ p* `8 ~
        unsigned int a;/ ?/ P  Y! }3 C6 w8 _2 U
        unsigned int b;3 E9 Z1 p- o: _$ G
        unsigned int packet_cout;
5 Q1 P) q, }, }8 n; J5 i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% X4 Z) A0 ^# h0 p! e! d0 @/ C
, j  [( P: v5 ?) L$ a6 o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( e7 h; {. Q/ a) i  f
unsigned int count_copy = 0;
1 n3 q' A4 f# |
3 D5 K( s7 I1 M+ L* e- k# |# t- O9 m
int main()
$ p  s6 p2 ~0 ?% F4 I, S. F{- o- a+ N( R5 v% A
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 |# u9 P, }6 e7 S% d, R5 ^7 h
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ p/ F, ^& a# D, i, V+ Z

: @! P9 h6 R3 n        while(1)
: M- y" O% j, o7 |2 y        {
; ?/ K& \/ o# M) }5 T                read_MSG_buffer(pshreRAM);
6 V; L* u: J  m+ M        }               
5 s8 E6 A- K" J0 w3 c& x% L; Q. w# F}
- z5 C8 Y2 ^0 N
7 r. D% D( e" o6 zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: W, J3 d; B8 h3 u% F) E" ]: E{) u$ i' ^: R- V- i4 M
        RX_MSG_PROTOCOL buf;
7 ~- p: h& j' Y+ R        
( I- y. D9 \& t6 Z2 R  ^, L  \8 ?        buf.a = pshreRAM->a;# m) T2 X0 b$ G
        buf.b = pshreRAM->b;
* p& r/ `* F5 v6 l1 u; b3 d        buf.packet_cout = pshreRAM->packet_cout;8 D7 v8 i. c/ M! `5 M6 |1 K. u+ ~
        1 T: F' m( u1 f6 p
        if(buf.packet_cout != count_copy)
# v9 `0 p$ q! {# P% u0 u* e$ S  R        {2 Y8 s3 O; ]" {. H) X
                printf("a is %d\n", buf.a);
+ ]6 Z: L2 u$ r8 _                printf("b is %d\n", buf.b);
. X6 i; Z4 z' C% s                printf("count is %d\n", buf.packet_cout);, {1 L9 b7 ]8 H) o2 z
                count_copy = buf.packet_cout;
5 a5 l/ o4 `8 G( E        }
% l% A. X; z4 c- E# P% [        else
- I) L5 N+ ]2 s. ?2 ]. I        {$ u2 s" d( F+ N+ P
                printf("No effective message!");; U( p( M  N: a) y$ m5 Y' V2 n; g0 a
        }
8 {$ C4 m# L4 D- P+ X6 C}
5 l. G* i# A# X0 s/ ~
$ `. J' A5 Y, l; k
' C2 P, U' m9 w/ P, c但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 t8 S" Y6 X$ _: {6 w
使用下面代码,对内存使用了mmap函数后:! ~5 U. E: |8 @2 K/ Z
#include <stdio.h>* C! K% |! S3 ], n9 o* _
#include <unistd.h>
( F; c' E: z! j3 O7 l- B6 D/ `#include <sys/mman.h>
; P, H' |; U0 P#include <sys/types.h>6 c9 ?  p" v: g% E
#include <fcntl.h>! _, Q0 q  K0 h
" R# Q; j* k. A8 Q3 N. l/ s8 p: n
#define SHAER_RAM_BASE_ADDR    (0x80000000)
% ^& F8 y4 [8 O. U#define SHAER_RAM_SIZE         (0x20000)   9 x* \: h- Y* n1 }
) ~0 T% B3 z8 e4 G. r$ @4 d
typedef struct
3 U0 m; \* r  Z$ p$ D5 M% k{/ k  u  L" I6 A/ d
        unsigned int a;, `0 J  s: P% d1 j/ O
        unsigned int b;
, L9 Z$ j; _' z0 Q" U6 o        unsigned int packet_cout;
1 E. r9 K; T  b2 H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  A) x$ t( q5 y$ ~& R+ H3 D7 y5 l* p! O% u. N* {; [
void read_MSG_buffer(int *baseaddr);8 g+ x4 g9 v" Y3 Q" Y' N
unsigned int count_copy = 0;
; `1 X& y, D( k& Z: E' L) ~7 c
int main(), v! k* a) x% t% G
{
% B4 n: J9 I. E1 H        int fd;
! d$ }7 I  X' ]) ]* S# b& S; f        int *mem = NULL;
# }! F3 S1 T( [9 Y" S3 c
% D. i8 k8 r! P6 d        if((fd = open("/dev/mem", O_RDWR)) <0)% ?0 y. Y: x% d' P) `5 D( ^( S
        {# M1 B0 t" L% v/ r( h' t( k
                perror("open error");4 g* [' r) o) Z! F4 J& C
                return -1;* \3 R3 p, J+ H0 H# Z% G; \
        }) M# I3 N; o( h4 B
          d5 }; W0 Y' i/ K
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- [3 W, p4 ^, G6 s, c/ D* m+ k: O+ N2 e/ K! H: A
        while(1)
+ x9 n% T, @; P  a6 J, Q        {
# N+ R8 I7 T2 n  N                read_MSG_buffer(mem);
/ W. N& R) D! C! s6 U/ a8 w5 R        }               
. X  ?" c+ Y! @  J. A& g}+ i% @% o4 f. r, H

5 g/ j3 q5 J# g, A3 l, uvoid read_MSG_buffer(int *baseaddr)' E5 G, T7 {0 I. P5 a1 t
{
8 A: ]2 w8 D. C/ K        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 y  c/ V% w2 \; |2 L  v+ V! B4 \4 I1 ]/ y  Y3 s
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: c6 r3 A4 o4 H- D4 i  Y' q% F4 U. h0 P& U0 x0 e; f, S! O
        if(pshreRAM->packet_cout != count_copy)
7 V2 n1 o$ @& ?7 N8 s5 }1 F- y        {
0 L$ F3 _, U6 g4 Z( e" @; w                printf("a is %d\n", pshreRAM->a);
0 o  b: R  t- I/ R9 H                printf("b is %d\n", pshreRAM->b);
0 u$ c  P: w& L3 l# U                printf("count is %d\n", pshreRAM->packet_cout);9 F9 ]; ^- i+ V6 l3 F
                count_copy = pshreRAM->packet_cout;
! t9 g0 O# {# W! p        }
1 x7 e3 q( ~' E        else
6 `) ]9 [+ }  e% L5 N; O4 |        {+ k* S6 X: T: K6 O3 b  D
                printf("No effective message!\n");
1 X) G; u$ l6 t7 H* A) J" c        }7 f1 q7 T7 K$ R, Q2 F" w
}0 j2 A9 W0 F0 @  b
% |' w* {. {  J8 z6 V2 G2 r
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* e7 ^: }, k7 J% R

& u7 E3 I4 {3 Z# S% F
# }7 @! z* `% H% Y) v/ r% `# Z7 Q+ l3 s" C
/ P1 r1 l" b9 V( i3 R) H% J7 p7 o





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