嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 }6 y. w  t; v% a' u& r/ M8 V
6 V0 \; E# t0 [2 R& JOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& ^9 {! b, B5 l% w" U  J#include <unistd.h>2 I1 a1 m0 |" ^
#include <sys/mman.h>* s& p+ m& H" b" A  f6 N& r
#include <sys/types.h>' ^) a3 |! j! |9 c* A$ U
#include <fcntl.h># X8 |$ n( G6 f% \1 s2 P8 w
) k0 a, J3 `( n/ `4 H
#define SHAER_RAM_BASE_ADDR    (0x80000000)     ~! ^  B  X" R, N8 @
, d" @- a4 w  @. C+ s# o
typedef struct/ }# O2 M) Z9 P. a, w7 E6 y" A* [
{
. L8 {( i3 ^0 b/ |, s        unsigned int a;
( Z' e# O) z& `+ N& G, Y        unsigned int b;7 @' h* g' w  C$ i% p
        unsigned int packet_cout;
: p! @  e. h" P/ y. y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; I3 p4 Q( a! \6 U7 v4 @8 J  b4 |3 w2 g! Y9 n/ n0 ~# Q) J8 u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);$ K6 ?  H4 @) e* o2 v) h
unsigned int count_copy = 0;; F1 _" _- y3 U( \

# t, v, J- D9 [& I; l+ A: b0 t& x7 r/ S" S0 W9 N
int main()
+ v$ q& b- N: m% E: Q& t, @{$ U' t( b, P9 Z6 v
        pRX_MSG_PROTOCOL pshreRAM = NULL;  v8 ~2 y+ y' K' |0 g: Z
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! K, e1 X, M0 r5 V" ^

' Q' ~! g" r% b        while(1)
) D! `. P" J( n5 Q" H1 L5 @! t        {6 f4 U) O- F) b; }/ ~
                read_MSG_buffer(pshreRAM);  m! C1 L. T8 F+ {% U! U/ x
        }                ! s+ w1 H8 ]' N* H
}
3 c+ n7 y9 P- S7 e$ u' E, |% V
. z1 `' G- A; J$ q) z% k! bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); k$ a, \% Z9 V
{
! J- U. L5 o0 R, O; ?' j$ `        RX_MSG_PROTOCOL buf;
" c' l+ S5 k3 E& g4 y        0 A3 M8 y, T  P
        buf.a = pshreRAM->a;
3 O3 o5 A% b, |" L        buf.b = pshreRAM->b;5 R0 _! Q& W9 V; x8 |/ C
        buf.packet_cout = pshreRAM->packet_cout;
0 H) q; o  Q3 l! l        
8 ~/ X2 L1 K1 C1 ^' X, V! l( A- a        if(buf.packet_cout != count_copy)
! n/ F( t0 X! x        {/ J: S# M. b8 h( a' \; z
                printf("a is %d\n", buf.a);) r& F; B! M4 R1 O
                printf("b is %d\n", buf.b);  w3 u8 v. g* H5 x, h2 ?6 c
                printf("count is %d\n", buf.packet_cout);
" B0 e, i# {7 v/ v; v7 m                count_copy = buf.packet_cout;* Q5 }8 |8 W- l1 B  s; S5 F, J2 r
        }
' d$ c3 y6 g9 b: g        else
8 {9 x: P# h! i; |  [" p: z        {
6 a+ X( H) }6 [4 T0 T' O4 p                printf("No effective message!");; G3 O+ ?1 B: v2 |3 k0 q) n
        }7 a+ I( K8 ^8 ~+ N$ y
}
* [3 k- s/ F/ r, {$ `% D3 O% Y8 B4 I

$ ?, [, b2 w+ g9 l7 n但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 S  @7 s" z  h8 l6 ~使用下面代码,对内存使用了mmap函数后:
  @9 w; d  Z% S- D( f* v5 h#include <stdio.h>
/ |1 ]4 n. W: d4 }#include <unistd.h>
" c1 m8 u3 }: r' k#include <sys/mman.h>
# h! D! l/ b/ m8 H4 o$ o#include <sys/types.h>
. y  y) ^; w* J& v+ d#include <fcntl.h># p- K. n- @- ?* J, m4 q
' I, ]5 m# V/ i4 C* M4 j4 y# t- E% M
#define SHAER_RAM_BASE_ADDR    (0x80000000)
# j4 @; V( ?- V' P" a3 P, i5 J#define SHAER_RAM_SIZE         (0x20000)   
# Q6 S" k% x6 n8 E  O5 N& F% [( M/ Q9 N/ W
typedef struct
7 S; \' K( u% ^' y% n# j- h{
# _6 f! Q  n* e        unsigned int a;
8 h( w7 p2 S# e% x+ V) y% G4 q; m        unsigned int b;" T3 B0 R) b# ~0 E
        unsigned int packet_cout;6 ]- @( q! L0 A0 h3 f. K1 i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 ~7 b# ]9 K0 u1 u& e

1 z; p' O$ o" O& D8 Y1 |void read_MSG_buffer(int *baseaddr);
$ \1 \/ j: y- K0 G9 E/ L' Funsigned int count_copy = 0;4 n: ^$ w$ D& x( E3 s

2 `) ?# s4 l# Fint main()3 Q( y2 b& l! v
{- L" m& u, b3 x% ?0 }- d4 b
        int fd;
$ S. d/ ^8 p; W        int *mem = NULL;
$ P; |( Z/ J4 _3 G& f  W$ J; I% G4 E! ]
        if((fd = open("/dev/mem", O_RDWR)) <0); Y$ a; v" W0 M* J0 B6 j& [5 t
        {
' {. U1 X3 M: ?  d1 Z' Y1 M                perror("open error");, s. m* k0 _. e) i& q7 Q
                return -1;  s- H3 R9 \# D3 c6 I4 j
        }
( y: l; o( c4 K0 z# l  e' H% u        
) `7 U) f; I$ X        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  @* w0 B7 x6 R0 t" v" L
7 O# }# n/ E9 |! p        while(1)
+ p/ i+ p0 k! H, a        {
& s( F. E. g" Q$ V9 k3 V                read_MSG_buffer(mem);
/ ]8 G5 l' O2 p1 I- c* Y1 g        }                9 B2 ~  u+ e8 B. X3 Q4 ]
}
6 _* x& s; W" x' ]4 i. T
; D  q+ a6 y0 ]* b* e2 |* G7 t" bvoid read_MSG_buffer(int *baseaddr)
' f, B  G1 l+ w) D# D3 Z{5 J  i4 K1 X. f7 @" @9 M0 H4 z( G
        pRX_MSG_PROTOCOL pshreRAM = NULL;
* G1 l8 T1 }+ O! J# }, B- ^9 v3 t4 `  J3 ?3 _# G/ V1 U$ S( N
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; g# B, Q7 L' z  Y' R4 [
& a+ }& [6 D+ d* a8 @% P0 A
        if(pshreRAM->packet_cout != count_copy)
3 F0 R0 ]) G8 z7 J9 H        {3 m  I" U$ {$ M3 w0 B
                printf("a is %d\n", pshreRAM->a);  E# M! L1 b# m* |+ q+ Z) {
                printf("b is %d\n", pshreRAM->b);8 J: V- M& E2 P! q% p0 h
                printf("count is %d\n", pshreRAM->packet_cout);
" l/ E- c" {9 Z% ~: B9 _                count_copy = pshreRAM->packet_cout;
2 h& e: {6 @6 ?+ l  c" s        }0 i! Q# s" h( G: k8 L* {, [- [" f
        else
- F$ k( s1 l; G& j2 G4 e* e+ A" L  r        {; a4 h2 c) @- i
                printf("No effective message!\n");
  X* ^2 n' r* s( M& ?$ r# ~) p        }
: R" Y! {1 \* p+ ]$ W5 H}
. m5 a4 H1 b9 z6 M  |
7 t7 `0 _( P, z$ L/ F; w1 r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  [9 ^3 a" L7 E: u( {4 A8 l- L

2 P. k/ A' I7 \/ C  c# z- ?. ?! _5 Z- T9 N

# v5 n6 N6 m+ g3 Z: B2 m0 R+ A* P
" B+ ^* {: r6 ^" s" A! P  y




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