嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 s5 g9 q# T5 q/ x6 \
) u' P, c( P. w5 z, |0 [0 ]' _9 Q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' K* y' Y5 V7 C) k#include <unistd.h>5 ]% k- u1 r+ B- u: j% i! V
#include <sys/mman.h>5 I1 K; Q! K1 ]  P
#include <sys/types.h>5 p9 B0 P) n! y* l9 V
#include <fcntl.h>
: S5 R; I2 w! e  u7 N* k
; p6 t( v: m8 H#define SHAER_RAM_BASE_ADDR    (0x80000000)   
# g$ v* F% F5 H8 K: A4 B* ~. ~
  v: T! n0 Z3 U7 z, wtypedef struct1 n$ i9 O( Y0 F. @
{% C$ l: N* [/ C" X7 J4 Y
        unsigned int a;
0 K$ f+ `) }; S( [# b" e        unsigned int b;7 m, ^( y7 ]# ]+ i- R- H9 [: d* p
        unsigned int packet_cout;
$ N. P' b  w% N/ f+ F& e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) Z9 ?1 b) Q+ |* y* h7 L, w0 [  n; J* p! f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 L; t3 l2 N" o( t7 v/ I0 S2 @unsigned int count_copy = 0;# i$ e- F( Z' {0 M

" @4 y% L6 W) e" x# m( s. q: z% `+ k" X, R- T# a  ?
int main()) I6 G! n2 K* D& J9 k* ]: [
{# y+ O$ Z: p1 v, C& u/ c
        pRX_MSG_PROTOCOL pshreRAM = NULL;$ {; P$ x* H" r; H
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; K' _3 S3 q# }) E6 h
( x# N+ H, m! y$ P$ U
        while(1)
2 a& [0 d' Z3 G9 y        {
7 o* n8 Y1 w  Z; `+ S7 d( a                read_MSG_buffer(pshreRAM);
8 X; N3 E  S8 f# L/ d        }               
* F7 ]) ~  q' |}4 e+ K8 n5 }7 S$ R2 E% V
- z' s4 U' A* ]/ s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! C* w- i$ u  f/ W* `  k{
& A4 O0 N3 a/ E3 `" s8 H, G        RX_MSG_PROTOCOL buf;
( Y9 M8 E1 v* W  Y' R, W7 B        
( |' K1 S5 R# j! N5 {  g        buf.a = pshreRAM->a;4 y  x8 f  F8 t3 T
        buf.b = pshreRAM->b;# L* j( u/ R; J1 G+ b5 j
        buf.packet_cout = pshreRAM->packet_cout;
0 P4 p4 `+ v3 r* A# ~        
% q0 W& O: r7 N  [! p. e. j6 \        if(buf.packet_cout != count_copy)
- u1 R( ]7 N( z$ X4 Z8 O        {. }  x3 f; Q- ^) I
                printf("a is %d\n", buf.a);5 `  {: F% B! D# o8 w4 ~8 E6 x) @
                printf("b is %d\n", buf.b);
5 N+ e+ }3 z: p% G2 F4 O4 z  `                printf("count is %d\n", buf.packet_cout);& d& ~9 F1 w* v; K9 {
                count_copy = buf.packet_cout;( l9 G6 |$ i7 I- s9 \; `
        }' I4 s8 l, m9 G
        else
: o/ d$ X/ n# F        {
8 E5 Q0 T+ F" @) d2 W                printf("No effective message!");; d) D# u# L% H
        }
  B% S- h8 q1 f}) l! }1 S$ ~& i3 H& Z+ i
! l  Q0 }4 R5 z1 f( y- N; `. b
5 A. j9 N" C$ U, L- `! [# x( Z8 C
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 R8 D/ k% }% @' i  H5 \4 j& l使用下面代码,对内存使用了mmap函数后:2 M$ a- M; `$ Q
#include <stdio.h>
: j1 @' ~+ _$ \#include <unistd.h>+ Z( H' s# z; y  r7 h8 b/ s& d
#include <sys/mman.h>) F4 t5 M+ g2 X7 c
#include <sys/types.h>5 z8 I5 R+ Z+ Q$ j
#include <fcntl.h>
% B$ |3 V( u% O: y( n* U% m$ B9 f  [8 r% i" C
#define SHAER_RAM_BASE_ADDR    (0x80000000)
5 q& R5 V& k7 i#define SHAER_RAM_SIZE         (0x20000)   * T$ p$ e' l9 E8 z$ D

, y4 ]) I: X% j+ j9 c( B9 @2 Stypedef struct/ D% _! |* E; s1 k. k$ `( `
{
5 i) n+ n* v, p, \        unsigned int a;
" f# {5 m) B8 s1 z        unsigned int b;
  h: Y) V( p4 j/ i% A$ q: q1 b0 p        unsigned int packet_cout;
& L4 F& H) g" B) B8 Q- \1 @% e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 A7 x$ s, ~1 A: X
3 l7 V$ j& d) ?0 P. Uvoid read_MSG_buffer(int *baseaddr);
  Y# P# g- s( ]% Junsigned int count_copy = 0;( s) Y0 H' G2 Y# S0 L3 m/ H

( S  W) I6 _) v; `7 Aint main(): x' v' b; i1 @. {! a
{, z  D: d$ R- P9 X$ Z
        int fd;
: h. K' D6 g' a9 _        int *mem = NULL;
4 M6 H4 ?6 @* ^. b" A$ ]5 R8 N" F% Q' p/ p6 W7 a
        if((fd = open("/dev/mem", O_RDWR)) <0)
2 ]6 _; H( h) N* @$ Q$ _8 u$ l        {  e0 A" L- |- U
                perror("open error");$ `+ a8 E' ?2 H0 u; m1 W1 i
                return -1;/ Z) v/ K6 I/ D
        }
3 j. S/ d4 k+ B: _0 x        " Y$ v$ J) W9 N. T7 Y
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);) @6 S5 o0 W6 {: O0 j/ t0 T6 z
9 k- N. @6 X7 x# F0 E- o8 p
        while(1)3 C+ ~7 c& a$ B
        {
# D! [" j# S* ?# I: [% L- U                read_MSG_buffer(mem);
) b! j3 n5 P# _        }               
& g' y8 b* E8 i6 j- Z3 a% g) \% i}
' z6 V" Z) j* e0 J0 g) f
8 o$ U: T0 o6 ~- O7 Ovoid read_MSG_buffer(int *baseaddr). f" T9 a$ Q9 i1 o0 k
{5 {# d( \7 g; z
        pRX_MSG_PROTOCOL pshreRAM = NULL;
" G" S& z8 x/ c% L* |  `. c' X+ c# h6 d; K% h/ J0 @9 P
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% {8 ^; p# K* J4 o
7 V0 }$ A3 x: z        if(pshreRAM->packet_cout != count_copy)
; I6 V2 x0 w4 V0 f' d* D2 G! @% f& \        {5 p! X& ?1 p& R+ g3 o
                printf("a is %d\n", pshreRAM->a);) _+ H$ D/ x1 {! W; @0 a
                printf("b is %d\n", pshreRAM->b);
0 K. G( V7 i7 v( _) Z: {                printf("count is %d\n", pshreRAM->packet_cout);$ ^! P: o& P; I  U
                count_copy = pshreRAM->packet_cout;; I4 B5 G* n" k( h. q
        }; Z/ p* D* {; I! y$ b) N
        else
" Z0 Q: o& ~, E7 Y, M        {
! G, `4 V" q( v3 T                printf("No effective message!\n");  s0 P5 p+ V% z! a9 ~7 \3 @
        }/ ]9 w9 z! o0 z8 ]# o$ I/ r: r9 N
}
+ K& h3 G1 m  J  j, p% T: V8 v  m6 S% K: o) j4 }6 f
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???2 |. g" g5 n% X
+ k% A2 U4 P1 h  U) z( ^% `$ m
* O+ U; c# }3 w# z! m; [0 f

# ^$ @8 w( _0 t1 B5 q3 b8 W$ {9 ^2 I# E; b. f5 c) o4 w  V





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