嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 B6 v1 `$ w0 t) _* x
* M* q; I0 m5 V: E  F  K( Z* L
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 v9 F5 h  A3 g3 ]' ^
#include <unistd.h>. z! [! l- h: t! s5 z
#include <sys/mman.h>
" D$ B4 v* N: ?5 T#include <sys/types.h>% U$ V+ R0 W: N1 o  B
#include <fcntl.h>
( y/ n9 S6 \8 a! }, k* a
( a: f" P/ i% u# G  t4 r# D#define SHAER_RAM_BASE_ADDR    (0x80000000)   & U2 [2 e: U7 Y5 M  S

' A4 U" A, E7 y5 o7 T( _typedef struct& \# f6 Q6 G$ f: F) C! c) z3 e
{( V3 V: M" q' n  N
        unsigned int a;
% b, Z0 f' J8 @1 N! w" r        unsigned int b;7 L3 R. n* \4 G% h; e  b2 q* i
        unsigned int packet_cout;3 a6 g! S  v: S" K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 q! ]9 @4 G8 q% S/ m+ a+ ]2 w2 ?3 Q
4 K$ l) K4 t: \# E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 u$ T9 C) n1 N6 s: Vunsigned int count_copy = 0;2 D6 d2 Z- `. d& k/ U) D- h
+ E# `& v4 }6 w0 r

0 U/ M+ {% x% `- |: \- r) q& k! dint main()$ W  m( m% o8 V
{# p) F* D2 o9 }. W! r
        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 W7 i! I+ `3 B        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;" Y$ z+ n9 j$ s* l6 h1 T2 P. B8 P

; N. |! b/ A' Z1 J- Y3 ?( _3 b        while(1)* I, \  y& Y3 ]. N% |. ?3 |6 T
        {( T  `& s5 T( h; o1 M
                read_MSG_buffer(pshreRAM);5 o  b/ o: ]  S" S
        }                $ ^2 r; M3 V/ a) f2 f7 u$ s1 d
}
0 m' a, ]3 `0 v% x+ T$ [' s
5 w7 T2 L: W! a% v$ ?; Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  l6 B5 N4 ?, C3 O- M5 F{2 x! m- b% F1 `% Y% l9 ^0 X* F3 y
        RX_MSG_PROTOCOL buf;
) t* D4 i2 ~( P* |; t8 p, ~' n        . m4 a/ E% j9 M) ~1 m* q* C) D
        buf.a = pshreRAM->a;
8 G5 {" \  F: f6 _8 v        buf.b = pshreRAM->b;* n; y. |$ w, N  H( L5 `1 ?
        buf.packet_cout = pshreRAM->packet_cout;
- C$ j4 A, t) w9 _1 h9 _* N( w1 j        
! w  t! D7 a. S3 _. \        if(buf.packet_cout != count_copy): R5 Q% B1 G: y3 {* a
        {8 q* b2 f& Q' h0 @* y! K
                printf("a is %d\n", buf.a);
+ }8 g1 O% I5 j5 H, ^                printf("b is %d\n", buf.b);  U% {7 |0 c8 ?* B8 t
                printf("count is %d\n", buf.packet_cout);! Q& ?4 n( q  T; \# f9 ^
                count_copy = buf.packet_cout;3 H3 W& ?8 S5 G0 Q" c+ c6 m+ W
        }
) h$ o8 W0 l. H, m2 r4 t        else4 R2 v" K) o9 W3 t
        {3 d$ e1 f( u9 _
                printf("No effective message!");+ o( i- }2 p- g- y" `. L
        }1 V8 A. I) S! P# \
}
% }+ t8 v, L8 k  V7 t( h4 e0 Q; t; |! G- E1 w: W

% c2 b# |- S% j+ z& K但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) K% Y! y& b. R# k; v# M使用下面代码,对内存使用了mmap函数后:
) V, p2 x) u! t#include <stdio.h>
3 k2 g  V' U0 G# }) B$ I#include <unistd.h>
6 B2 m, ~2 X9 b2 A#include <sys/mman.h>: B2 D$ E( Q- p" {% L: w* j
#include <sys/types.h>& i7 L" l' x  H3 R+ b$ R8 ~! T6 [
#include <fcntl.h>
; A3 n7 P4 z  m" s# i6 u  r2 S
9 }" k# E2 O9 ~#define SHAER_RAM_BASE_ADDR    (0x80000000)
; ^: ~/ b" e, ]# O9 m7 U% R& K#define SHAER_RAM_SIZE         (0x20000)   , w, W/ H! n- p3 a
$ t3 v$ [! y5 D3 v- U
typedef struct
8 g' \8 U, Y3 e/ ?: s5 N* O{
  Y" A0 Q7 G+ Z- C        unsigned int a;7 k4 W* [9 J1 m! D+ }1 z
        unsigned int b;
. Z8 W- c3 b( f* M1 h* q        unsigned int packet_cout;
4 @& P  l  I' _' E& M% G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" {& q5 e3 X& M4 S
% Z4 S. v# E# N) z& evoid read_MSG_buffer(int *baseaddr);6 J6 u# k  l! {0 n- L: Y* ^4 A
unsigned int count_copy = 0;$ S$ o* |& A6 d0 }! k
+ t3 L0 q. j! g' U! j; g) d$ u$ |8 f
int main()  P5 ~' I  g( g2 C
{/ n3 @! G0 B7 _9 H1 A
        int fd;
+ }  x( z- a. b% S8 [* Y        int *mem = NULL;
1 M% j4 i! Q7 A" Y# T
2 e0 c/ g& I' `$ `- Y        if((fd = open("/dev/mem", O_RDWR)) <0)7 a% b  S' _/ H" T% r+ t
        {% i6 G' l( n( Z( u
                perror("open error");2 {: X! U( V9 J  l" g
                return -1;) q# W# |- H( G1 d0 @
        }' i$ J- H8 I4 c9 d! c/ [
        
% z0 ]8 D) O6 E% ~/ [6 G' c/ m3 k        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);5 a* |4 d2 I  Q

. I0 g6 ~9 Z- m# U' \+ @5 m% {, x        while(1)' @0 f9 F2 e. _
        {) V# @4 @7 g5 O
                read_MSG_buffer(mem);6 Z' y( d5 V( l1 ~$ F3 B( J4 ~
        }               
9 ?) W5 Q# _4 h( W}6 u: h4 `# f& @; [9 x% K  V- S

/ L9 F3 w1 B7 e' U& z5 B( _9 hvoid read_MSG_buffer(int *baseaddr), k0 o0 b- Y, l/ }! B) s" _
{9 P* Z$ o( ~0 D: R4 f
        pRX_MSG_PROTOCOL pshreRAM = NULL;
. ^+ x" N# P9 u% X0 V: a0 i( N7 `& G. m- v. L! E# ]( B
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; n, F+ @; G( Z# c
* @0 k' R0 H) M0 g3 l+ D        if(pshreRAM->packet_cout != count_copy)
) A$ |) s# ^/ }6 x3 U# ~8 @        {
% K* q5 W4 }+ R. V8 L+ c                printf("a is %d\n", pshreRAM->a);
) i1 I4 @% U  ~" y0 y# _/ Q                printf("b is %d\n", pshreRAM->b);2 h5 L! M! A, \% L' |
                printf("count is %d\n", pshreRAM->packet_cout);
1 Q& j7 T5 c+ ]! z                count_copy = pshreRAM->packet_cout;
! T. ^& K& w  B        }5 C) Y3 [* C0 z5 b- K
        else
% W) Q* G* n& R4 H7 A        {
+ ?; L4 p$ F6 F3 v6 y- }                printf("No effective message!\n");  k. j/ |7 ~* R6 t' @
        }
2 U  L0 ~3 l4 b}; R8 N- L! M- _! T

7 v! f3 ^# ^& I, x. b5 C没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' w, m* ?8 G9 l, J4 U0 l" g6 A/ E
& t! K( I. q1 u1 B; U

" T9 U8 {5 n/ h; G, C+ {$ W
: T8 [5 l4 v; p+ z
3 i* E' v' f' Q( y+ m% L; {/ U




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