嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 T# R2 t# T6 B3 F4 ^
! e* T% U! e, y, {$ oOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. M" V" u, x1 F2 C; N' m#include <unistd.h>
, m8 d1 s( N5 \4 ^#include <sys/mman.h>
* B8 I6 d, a+ F3 U' l: B#include <sys/types.h>
4 f- h+ W2 L; c; t8 u$ z#include <fcntl.h>
, J) [, O3 T$ s+ s) c0 i7 f5 ~/ w- d& l/ c
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
: i: z6 V& Q, \8 J; C$ e7 \. r2 E4 c$ |2 h! {
typedef struct( R1 E, N9 r3 s" {
{
/ e" {- V1 r% v( z, J; ~. V4 g3 h        unsigned int a;  o0 l$ ?1 w5 c( p6 }) R5 F2 l
        unsigned int b;2 F7 s# ]8 O- D2 U
        unsigned int packet_cout;! F, E& w/ P$ F6 }/ C; f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ y7 N% w- y' |
) [$ }5 j' y# n9 T2 d  R* U1 B# ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 M" q% {9 A& V' _5 b0 d7 e
unsigned int count_copy = 0;8 j9 f* U) |7 T3 Y, x% _
+ P# j& b$ x9 b0 ^
  p0 n  Q. i4 J; @0 A
int main()/ T% f! M9 d) n9 [6 K" Q
{! C: S+ K1 |7 B+ {
        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 C3 X+ D; ]" S! b! }. J1 O        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( Y7 G+ d. y( [3 z! P* F! S- N  X/ E' w4 U: p
        while(1)' z6 p! r, n: s& J- ?
        {
: C* n7 Q5 p5 p6 l' t                read_MSG_buffer(pshreRAM);
' j* G7 y8 U: L' o& Y: F/ G) s! p        }                ) E5 M8 |# W" I3 Z+ p0 ~
}& y! u& S# @9 o
! J% T4 ]5 _+ |# F7 _& k; X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' V+ T0 j) C6 z{, K6 l7 S8 J  N
        RX_MSG_PROTOCOL buf;+ [: S& D% f5 y9 a% X# K* R
        % d7 ]# l7 S* V
        buf.a = pshreRAM->a;$ h) X5 C3 H9 _, n1 d! [9 ^3 F
        buf.b = pshreRAM->b;
4 z5 G8 M; @$ h5 ?& E! t        buf.packet_cout = pshreRAM->packet_cout;7 ^- E7 l! s% S7 f6 k
        8 D: ]6 _& \$ z3 q: m7 e! |/ c
        if(buf.packet_cout != count_copy)* r6 A$ J1 Y$ h! f1 a- M) P* ]
        {- U+ X" z( e2 o3 q9 }. O
                printf("a is %d\n", buf.a);
2 Y1 O' `% y, z                printf("b is %d\n", buf.b);' _: V7 Y$ Q* E" l
                printf("count is %d\n", buf.packet_cout);+ q; n1 y( n" ], U! p) t
                count_copy = buf.packet_cout;
& G) j) V3 S3 ?. Y) Z! q6 {        }
- R1 ^. x3 r% V3 B: u2 d2 t        else6 K2 `& W5 M, E" m8 {* s
        {9 ]# c7 @* X6 |  v* k4 w2 c
                printf("No effective message!");
1 q$ X7 b: ~# s; v" y9 K2 l        }& f' t# @0 g  I: V
}+ y: A5 u% N" R6 S2 ^  q

& `( ~. z) q0 y: @1 C- [5 E5 e2 N# R/ X0 w
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& |& |5 C6 k$ R# j5 y使用下面代码,对内存使用了mmap函数后:, z) P% Q- {( r6 N) v. W9 c
#include <stdio.h>2 m1 W, l  L1 Y6 T4 S7 P/ j
#include <unistd.h>! g' c' A% F! O( C
#include <sys/mman.h>4 Y/ p/ {# X/ A- c
#include <sys/types.h>* s6 c( V" K; p7 F  m2 }2 M
#include <fcntl.h>* Y4 W2 }  G5 b% S6 ~! y; D

$ V$ C: i9 A0 r  E; n6 d#define SHAER_RAM_BASE_ADDR    (0x80000000)6 \7 i0 K  F7 l! ~+ `( U
#define SHAER_RAM_SIZE         (0x20000)   
* e9 u* @/ C" H9 B5 J! f4 o5 Z+ Y
, s$ K) x5 T: L% ^+ Ftypedef struct
. A) P  o7 f# v7 f{
( L0 A) y+ W* A        unsigned int a;: p8 }2 O0 e. F1 O& L6 E
        unsigned int b;8 I' i1 Q4 E, T
        unsigned int packet_cout;
. H- D4 k: K* G: S' D; b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  ^1 s+ c; y% Y
- J: i4 Y5 m! Y, n, c
void read_MSG_buffer(int *baseaddr);
9 ]$ @1 |  p6 ~( p  h( i8 u$ junsigned int count_copy = 0;* {- O' H& D& @3 K% D  h0 |' g

0 j2 f1 r' [1 v: G& e6 I) n& [int main()
) G/ Z( L0 r8 f% W1 P0 \7 n{1 u; t% V7 o# [1 N5 |/ R4 J
        int fd;
: m* q2 p2 Q. T- z4 U; t7 k7 ~        int *mem = NULL;
: U: H" }) h6 Y( e5 v& P
3 {1 h4 H5 T9 o  ^3 c1 D: y        if((fd = open("/dev/mem", O_RDWR)) <0)! K+ }. C9 m1 A$ m3 R2 [* Q. X4 n: b
        {
5 }( e* ~4 o6 A% i" Q9 l                perror("open error");
% ~! r1 B5 n6 A- X4 v. q6 K: V                return -1;# O5 w" {! P/ n! `5 E. r
        }( t( K9 c+ N: t) I5 V
        
8 D- S( N% D% |        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; f. H* P. v) @7 P1 O) ?! x

5 Y8 g$ G4 e: N        while(1)6 \* q. L5 L6 p" j! X& z9 U
        {! _: z- q( Z5 B, T& E9 M6 o
                read_MSG_buffer(mem);
% E+ f' z, C; N$ I, @* ]        }               
* d) d, P5 \0 T. j1 B  T}
" d" _9 v3 H) M- o' U
$ T* r; p. U1 p" s& o5 S+ w0 M6 Gvoid read_MSG_buffer(int *baseaddr)
% [$ W8 j" u! G3 F{
0 X2 ^  H7 W' U. |6 l        pRX_MSG_PROTOCOL pshreRAM = NULL;
; |1 t, \5 h9 b" N4 P1 z4 n9 A) s/ \. {: d4 H
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 j, R# f# ~) e6 a" l( t2 n2 I& G0 [& f4 p
        if(pshreRAM->packet_cout != count_copy)! E( N( `6 a3 b( Q- H
        {6 q& w( Z4 f6 Y5 `3 z7 E! o
                printf("a is %d\n", pshreRAM->a);
( D  S$ ~- u" `8 W0 x5 q  b0 u& N                printf("b is %d\n", pshreRAM->b);
6 c7 Y, q0 _7 M: |! Z* P( W$ u                printf("count is %d\n", pshreRAM->packet_cout);9 j( `7 @4 O% q
                count_copy = pshreRAM->packet_cout;7 N9 d7 P, q$ z1 u, R8 j
        }
' U( _. u# D, m! T  j+ {# g5 m        else
: ?3 d1 @$ ]- }1 p. O( B        {
  U7 |4 [' b( d; C$ e                printf("No effective message!\n");0 C8 f  D5 K% D6 T/ n
        }1 Z1 \8 q1 a' P. r
}
! S: ^: J0 l) k4 x5 X( }- P8 |$ `/ x4 C4 X8 l8 C
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 @2 U+ `2 o1 A/ c) G1 C* ?* N( x* m* R" v. S* ~; {# x

  v4 W+ ?* q  r0 U( r; V* D% U
/ W. |6 q, n: q4 q! G' j





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