嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑   X4 q+ a) D: Q: f$ }/ k+ b
6 D+ u- S7 R& j; @- w/ C3 |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: n0 r% Q* D- H! r" n# `3 d; `$ B5 G#include <unistd.h>) h6 C( D, O8 R9 e
#include <sys/mman.h>7 o$ r& p; H3 q
#include <sys/types.h>; z5 ^7 w6 O! ~7 ^" J% R7 N: ?
#include <fcntl.h>
3 V7 I- @) S9 s6 v- c, h
8 `1 [" l5 ~' P) g, |) o( U#define SHAER_RAM_BASE_ADDR    (0x80000000)   
$ I/ D6 [% k& b
: ~# Y: {. T  m- R. Ftypedef struct
7 m- B6 n" K, S{
! T/ l8 i- h2 n& T        unsigned int a;! `* z1 i* W0 `9 H# b: U
        unsigned int b;
. ], j1 q, l2 S% n        unsigned int packet_cout;1 P9 {, [, `7 y0 W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 c# j8 K. R* q( \0 w4 I
. @/ a" }+ i  o" {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 [' f  v7 ?/ N0 K4 P3 c4 t% Tunsigned int count_copy = 0;
/ @2 E* x* `( T5 `
1 N1 v; A8 i# E- E& Z2 b" I1 G( B4 q' O7 @3 V
int main()! U, H+ I% n; }( |, j" I$ G+ @- f% b
{
* }1 {' a3 p5 m: P: Y$ x- J: F        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 H$ [" z8 x* O/ N        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! `; X1 Q! |" U0 D/ \" U
  l. {, l  y( H: F/ Q
        while(1)
/ S/ M0 p0 p" i: p/ [        {
% N/ X0 n% T4 W: K2 c5 u9 G                read_MSG_buffer(pshreRAM);" t; O, d6 [7 a
        }                : I# [8 \( s% e2 E8 O6 l( _
}' r6 I  d5 K8 _% r

! R, b1 e6 `& N7 `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 P, I: Z( V+ B" R. P) V+ z{
& A/ `& N. n& y4 p+ b/ e7 _        RX_MSG_PROTOCOL buf;( O+ H: M+ i3 d0 ~
        
1 t( j  L& ]% B        buf.a = pshreRAM->a;! j1 Z- Y; ?1 r, s  ]
        buf.b = pshreRAM->b;
, T6 Q# h' o- V/ d2 l4 T: i; E3 \) z' \        buf.packet_cout = pshreRAM->packet_cout;* O1 \) p# V1 V3 Q. b
        1 T. a$ Z, m* X8 v4 Y
        if(buf.packet_cout != count_copy)
0 g# U8 I4 c. ]6 u* e        {
# k2 X$ D4 Y9 X                printf("a is %d\n", buf.a);4 i: ?  u* @! p3 U. `
                printf("b is %d\n", buf.b);! X$ C" C9 L* b8 G( I
                printf("count is %d\n", buf.packet_cout);
9 r3 `: [6 H- p) D0 z( g                count_copy = buf.packet_cout;& k8 D8 F) v, w# j9 q) G; p; v. }+ e2 t
        }
+ \2 z6 t) i$ k: F        else
2 \" S; c" @9 x' H        {
, i+ A0 N. l1 p" A0 [                printf("No effective message!");
( K# @  M( V$ ?$ G        }' ?/ [0 g- A! V" T
}: A3 y% Z; ~& }$ ^4 D* C# p

  K5 k4 B+ E5 }" U/ p2 U$ q* u
! O1 N3 ^3 D3 E( F+ K6 d1 ^但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' Q4 b5 }/ L( P, b" R% l0 J使用下面代码,对内存使用了mmap函数后:7 E" ?5 d1 ^7 K7 [3 W8 y" i
#include <stdio.h>
& \% w. X* z, d: X#include <unistd.h>- ~; e3 U2 X! g0 [2 n* ^
#include <sys/mman.h>
) f3 B% L! W. r& M#include <sys/types.h>
! T. }7 ^) B% j* X: u+ o#include <fcntl.h>
3 f0 Q" B3 D% p
" G  u' v0 ~. t: F#define SHAER_RAM_BASE_ADDR    (0x80000000)
, P" i, e$ ]2 h" S' }7 q#define SHAER_RAM_SIZE         (0x20000)   # w) o4 N+ r! ~7 }2 U8 K1 _

# W0 A$ o. k! U0 {+ k+ Ytypedef struct
" f: S9 r1 i' V{
1 O! @7 r; H9 P: A        unsigned int a;
; h3 T+ A: X) @  ~        unsigned int b;
1 K7 o* a' I' V% s9 N8 K  `. d        unsigned int packet_cout;" O6 s# v$ [5 {& C  c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  E, k& x1 H4 o+ U3 U6 L8 e4 {4 t9 T! N; [8 ?& ]4 W
void read_MSG_buffer(int *baseaddr);0 l6 W" C: ^0 @
unsigned int count_copy = 0;+ C! d5 q2 F; P. A. X: A
6 m3 |0 j" N2 X
int main()) d: ^; G; s( o3 W* \6 m) c: w
{# e* }5 |% o/ ]4 o' ^& O
        int fd;
* r; W& }) n* o2 d# H* z0 v& J7 p) Z1 o; S        int *mem = NULL;3 j9 `6 u. E3 L/ \8 }% v. Y
% i+ j% f/ {8 i6 x% e; |
        if((fd = open("/dev/mem", O_RDWR)) <0)& O, I$ ^( G6 }4 J8 T
        {3 a" _* {& e. ^6 g. F& d
                perror("open error");0 f1 q* K8 Z7 V8 S9 c" G! B3 E  {
                return -1;3 {6 t0 \% K4 x# @( I4 X
        }
3 x1 q! q2 B9 v5 ]/ P* p        
" N% G$ Z) X& k; h+ Z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  {! [8 ]% T; w9 `" Y' K4 q/ P2 `9 W5 Z1 ^% X# H
        while(1)
/ f( l6 Y4 _) `9 k        {
+ Q' P+ m1 A0 a, o8 R                read_MSG_buffer(mem);' K  _7 x8 e! `) H
        }               
/ K- X; }% t* L) @# C( V) e}! a2 L  p; U9 ?) F' f9 b; _

  ?) V4 O% ~' T+ y9 z# m, gvoid read_MSG_buffer(int *baseaddr)' R' L) @" H, `" S4 l
{! O  y: K; Y+ H5 B
        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 I! t) I! x( u# ~) d4 l& L- M" j/ W
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  r5 E1 D3 H* \# G2 \0 \7 r( p% A8 Y  p1 G* r" g
        if(pshreRAM->packet_cout != count_copy)9 {2 j8 \! {% q; f6 M% X+ ^$ _
        {
- T, O$ H' h5 k+ T8 m                printf("a is %d\n", pshreRAM->a);) a5 L& X9 F' ]2 w- l& }8 v5 T
                printf("b is %d\n", pshreRAM->b);; \3 j+ l3 }# k" e4 K6 _  \4 b
                printf("count is %d\n", pshreRAM->packet_cout);
$ T* G, `3 E, l5 e7 ^& P. S: H                count_copy = pshreRAM->packet_cout;, X: g$ d* m) Y
        }1 j) o: ^5 X% s- ?2 i
        else9 `+ r( E, p6 c6 s
        {7 a6 }: n7 W5 I; a4 J
                printf("No effective message!\n");6 o& j4 \, A1 K: k. m. m
        }
& W6 V  c8 t& ^1 T( @- E}
7 p/ |+ J0 G9 N; q- z9 ~
7 }& v& s* J+ @. c7 Y) Q没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ ]/ X1 E2 ^/ Y6 v: y$ F! C9 W9 B. A5 ]* m* n
( b" ?8 ?* F" o
' q& C5 j; w( x! m* g

  C" g) N# w0 s# H( }* E/ Z




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