嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ; Z1 ]4 ?- y/ I* N0 ~* G4 F
6 i1 }2 R+ o, g* q8 J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* q0 \0 b# I" T$ H6 h  J#include <unistd.h>
+ V# o8 T3 Z$ F+ h3 Q#include <sys/mman.h>
7 W. `6 u; x/ l% U#include <sys/types.h>: y$ ^- c7 F- v3 j2 ?" P& p, h
#include <fcntl.h>9 a. _2 ^2 O1 V, h- X) j
5 ^! ?* [  O  p
#define SHAER_RAM_BASE_ADDR    (0x80000000)   0 X- E  ~/ C& A3 E
. b4 S' |" H6 n$ z; g8 X
typedef struct
* |& Y) P1 |* _  U, w7 P{, Y$ [  C) A5 B. j3 O# L
        unsigned int a;
' f) p+ O9 h  M  L" r        unsigned int b;
4 ~& b1 W  J' a+ j1 r8 j$ W, S( |7 ?        unsigned int packet_cout;
7 D$ h* J) M/ s% m# |6 m$ P- V; s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  c% K: C/ J# S
/ k) s, k' \7 I1 G# c5 X' Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- [% ?4 X' i5 O8 A
unsigned int count_copy = 0;  v5 j. }% t: p

4 `7 r9 Y3 H% M% \
3 j, w$ X, k1 J% v0 a- Kint main()
1 t0 z$ c, b% N, T4 e. ~& J; {{
% ]! w: @2 C- K4 \4 o  h/ O        pRX_MSG_PROTOCOL pshreRAM = NULL;8 Z/ \, O( O" x& Q  j
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 J- b" E; e. f6 k6 l8 [( Y4 @, m9 ~) w' P- A7 y
        while(1)
  X5 ~: f$ X" T8 \) w        {5 ]1 U/ i8 e# X* r+ D+ \& V6 Y
                read_MSG_buffer(pshreRAM);
" ?% V7 g, m$ S0 m  y, G! p3 o        }               
4 H9 o% p, Z1 `6 _1 |- \}+ u0 z' j" c+ J, g% ]
0 {8 o8 u$ f, s  n9 H5 K# Q; j$ Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 I! }& P( z9 a- }
{
# B: Q: o# Y, [# w        RX_MSG_PROTOCOL buf;& L" [3 `* F  M# v' K
        
3 Q% M0 o' T; O8 K! N        buf.a = pshreRAM->a;  J) N( O# H0 C6 W
        buf.b = pshreRAM->b;6 ~! x" C8 o8 a+ |1 J
        buf.packet_cout = pshreRAM->packet_cout;& f( K/ j  [" S3 M. U  v
        
) ~0 T+ g8 a0 C; j, d, p        if(buf.packet_cout != count_copy)
& u, _" u! w5 l& f        {. _4 w# c& G" ]$ e; `+ c
                printf("a is %d\n", buf.a);
9 A# D2 v' F2 s: C& C                printf("b is %d\n", buf.b);
' w" [& q& R' ?6 e% F                printf("count is %d\n", buf.packet_cout);5 \. s6 i4 ]' [
                count_copy = buf.packet_cout;
9 {* X. z& _+ Y        }
$ h" E' b. g1 g# H4 j1 u3 k        else( D) G/ |! C% F. C5 \$ x
        {
# J. l& ~  B' R/ n  w' u( H                printf("No effective message!");8 `8 _0 i/ c, Q8 D8 H# Q5 j9 m
        }
* ?; Y( }( ^! n}
- H* }0 b0 U& F5 v" R" z3 @5 O5 t  `& K% ?
' r  I" y  F) G7 c! m
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 V* r( x; u! {6 F
使用下面代码,对内存使用了mmap函数后:
" M6 n! @: \& I4 V/ T# E#include <stdio.h>
7 X: ~8 E1 X5 t#include <unistd.h>
2 x3 ~9 |) [+ p) x. S2 b# [#include <sys/mman.h>6 r' d2 B) C! }$ t
#include <sys/types.h>
: V2 t" n3 k1 G3 O  w#include <fcntl.h>+ x. k# w& |6 m, g

; g% P+ w/ g& _# E  @0 A& E5 l#define SHAER_RAM_BASE_ADDR    (0x80000000)' p# w" c' T7 D# m
#define SHAER_RAM_SIZE         (0x20000)   
6 g+ w& O  \$ W& [# a5 x) l) v7 n9 v/ E* i( L' E( ?
typedef struct9 A  Y1 y3 n1 V% |
{
# U1 I1 j1 r' X9 `5 Q        unsigned int a;
2 J4 |/ V; z) E! \- k/ I3 @        unsigned int b;# r& e- v9 N# _3 H
        unsigned int packet_cout;9 k* r( [8 O/ O( E' q0 m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 h' a" s0 o8 s0 m, P0 F$ t" a8 Z; h7 {, J& H/ V9 c
void read_MSG_buffer(int *baseaddr);7 p5 `6 N/ l# l, t' W0 h( l
unsigned int count_copy = 0;
8 K2 H3 ^! [- h! ~1 Z$ b3 t* k+ m. h8 q" [; M; O
int main()
2 R5 b' V; S  }8 L{
. z8 X2 b5 a# y5 T" {        int fd;
- q) W5 {6 h# J' ^# O; Q        int *mem = NULL;7 {& I8 d4 X* t" L! j

8 H3 P1 y5 _# z1 a8 G, X        if((fd = open("/dev/mem", O_RDWR)) <0)( M. ~' K8 P7 v6 ?
        {
! z% F+ ~  ^5 l% K* D" o& G6 e                perror("open error");
1 G  ?. \. U: w7 ?: z                return -1;6 M  ~& {$ w! K) N; o5 Y
        }
+ ]& y$ O, L; ^7 I: l- @$ m        
$ {: @4 \% z9 L# S        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ G5 T2 P9 _# s0 Y
. ~: c  G, E- Z* G; x. Z5 f
        while(1)' e  }0 Q1 ^- Y1 L2 @
        {
' ?2 H1 c$ e# t" s0 m+ n% c' u- z                read_MSG_buffer(mem);
6 x+ U, b( d9 G$ _        }                  Q$ g, a, c6 H# G+ R+ i8 n$ A
}
: p5 _5 z: _! L' j# T  h  I: y9 Q" e* Z) n8 x  `6 W# m
void read_MSG_buffer(int *baseaddr)
1 Z. |# M5 y& m5 E{
# t5 }8 O+ ^' F3 m* r9 w        pRX_MSG_PROTOCOL pshreRAM = NULL;
' W( `% T' |) O; X( T
% ?; v5 ?+ ?: u  \5 h, U* L# z3 l        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: {- J9 \( G$ V* M' K$ l, A1 D
1 G* P+ h; s  F' B! l# u& B
        if(pshreRAM->packet_cout != count_copy)
9 A6 U8 p& S( S2 P: [. u& Z# Y9 k& H        {% @3 X9 _2 }; X5 V# X" v
                printf("a is %d\n", pshreRAM->a);5 f2 s) j' x4 Q' f3 B
                printf("b is %d\n", pshreRAM->b);. ~8 T% o% {7 B" U; m0 K# Y; U
                printf("count is %d\n", pshreRAM->packet_cout);
1 H$ u) F% n3 f' u9 K, ?                count_copy = pshreRAM->packet_cout;
- K- Q* v. l5 k  c' @' j( P# D        }) `% a. I- z( p: V+ M* [
        else
. r% P" ^7 s9 s. q! x        {& t7 K5 Z. ]: p0 U7 O
                printf("No effective message!\n");- b- l+ O. v# _/ o
        }
* R( N% s+ H, ]! y8 {3 {0 y}8 J1 ^9 C8 c& M9 {  J  @$ f, w$ {

  o. x$ r7 }5 R- |没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 R, l  D2 q! P8 m0 B5 @( A* [" N2 E4 X4 u1 z3 N* M
' K6 G! @+ d1 I
6 ^4 a$ b9 R/ Z. ]7 k% F
2 |4 j6 P& |2 h





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