OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4815|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 v' ~4 T, c% I/ a2 {4 j
3 j7 ^- h- m5 w0 ~+ A
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! k/ t6 F, z- K+ |, N, F#include <unistd.h>
; ]. S! w# [+ t4 L) k#include <sys/mman.h>5 }6 I% l6 P# t
#include <sys/types.h>
+ a9 V$ y6 Z, _# g#include <fcntl.h>% S  |& w7 E8 n
" Y# t8 F1 [) n
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
& w, J: D+ ^& l% [3 O
5 I5 G+ {$ F; q) ]+ s, Vtypedef struct
4 ^& C, h4 w7 |' f2 Q6 P{0 E3 ~5 Q! {% j% l( x! C& w0 h
        unsigned int a;6 p% r+ y- N$ Z4 E. ~) ~9 J8 X. X
        unsigned int b;8 p6 n; u  O, d( L% R/ Y' ]3 E
        unsigned int packet_cout;
8 I* H% F2 E& X: i) [& \& F0 x  F% o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 X! i! G* v& f' P/ d; q; u# d% K4 {+ G: P3 k) e) w+ I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ c( V% w% Y* Z2 o1 D6 e2 V' Q0 I: Ounsigned int count_copy = 0;
4 b( z, n) Q: D1 B
. g; d* z5 Y. y5 b* ?. X% Z9 c6 {6 ]% K& U8 j( X
int main()$ I& K5 b7 \8 q( Q- `$ s  U/ |
{6 x9 s/ b! x1 L
        pRX_MSG_PROTOCOL pshreRAM = NULL;
; P. o/ K  N/ w        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 Q# q( I' f( s7 k+ b! V3 N: _0 @) ^1 U: \
        while(1)# F! m: D; H1 @3 d- }
        {
1 q* F3 E0 _2 L, u9 N                read_MSG_buffer(pshreRAM);' o* h" e0 |9 I! t
        }                # ], w6 e. a+ ]: @7 K
}1 T$ U6 [2 Y7 `: b" e  ~, l9 T

  `! B& k: I; B+ B. f# Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! V. ^$ _; c  G8 Y: b, r$ z9 C{4 Z8 {' e! j' X# P' d! ?% I
        RX_MSG_PROTOCOL buf;
: X, x! Q; L# D! j# C        
( n6 e2 h. c& s& ~9 E9 A7 }        buf.a = pshreRAM->a;
; |9 d- }+ l2 p2 U0 w; }        buf.b = pshreRAM->b;
5 ?. ?) L0 ~, K. i" T        buf.packet_cout = pshreRAM->packet_cout;+ i# B+ x  v8 t4 d9 t
        
" _  T; d$ N2 Y        if(buf.packet_cout != count_copy)
) t' p, p# |& c$ s0 ?$ G7 ?        {- f( M/ u2 I5 i' r
                printf("a is %d\n", buf.a);
3 T3 W' Y8 Y% H                printf("b is %d\n", buf.b);, p& L& M" r8 a" i
                printf("count is %d\n", buf.packet_cout);
, t% W4 K% c  ]9 L5 Y                count_copy = buf.packet_cout;" ?4 O3 |" U7 x  C7 M* W' Z
        }
- J2 t: `5 s0 E; ?7 _        else: S& _: q) j1 Z+ U
        {
" \% L5 e% [% H# k                printf("No effective message!");  Z6 N; y) c7 {) `$ l& h2 g7 x
        }+ F) c/ R# o. q# T. c& \9 \
}
5 V& V/ ?0 q" V& ?3 r
/ P+ X3 O- ?" n' R& H. l% x! F
7 k2 l! R: e9 z) b但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 N% k3 z" `8 ~. t$ Z. W
使用下面代码,对内存使用了mmap函数后:
! B3 R8 ~) q; g  ^#include <stdio.h>% J  S/ i- ]4 R; e6 Y
#include <unistd.h>' a! j, ~( X) Y! i3 D# m+ I+ K; d
#include <sys/mman.h>$ l$ _" _7 b$ c$ f/ d% X+ \
#include <sys/types.h>
% w7 d" t& F) Q#include <fcntl.h>% ^. o; ]2 F* H1 ^& d* ^
4 l* ?! P( ]3 t. U# r
#define SHAER_RAM_BASE_ADDR    (0x80000000)- I9 r" P9 O$ K
#define SHAER_RAM_SIZE         (0x20000)   
" z( v, Z8 M7 b' g! r8 _
% Y: s6 K# V4 w1 W/ z, q* E, \  L% Ctypedef struct# z& Q7 V, H6 p' F# \) Y7 d
{
5 Y- Z5 b# b) {& H9 h" s, l/ g        unsigned int a;$ \, `! M9 A% i: Z' d
        unsigned int b;
. q6 i" t1 b# _5 T$ @9 n        unsigned int packet_cout;; C9 I' H- A5 ~7 k4 `% e/ a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 V% w0 q; n# y; z9 X( D$ d6 h7 u  T' e/ [+ I1 j
void read_MSG_buffer(int *baseaddr);
! z# O' h( S  p4 [) Xunsigned int count_copy = 0;* v, W% j. n: _7 j2 ~* J! C/ L, x% W
, i; s7 I6 v# U1 y, i
int main(): E1 {* |: L0 h$ W9 V  d: t
{3 h4 p9 }! Q7 o/ C5 }+ A. N( T
        int fd;
+ Z+ n& Z) C- t7 s) l( z- x5 g        int *mem = NULL;0 X4 `+ r& m8 G8 H3 Z/ E) Q8 \/ g3 f

- S3 G# p" J* G5 ?8 V        if((fd = open("/dev/mem", O_RDWR)) <0)3 ?8 O, r: d, k$ o  Q
        {
$ Y6 @5 Y$ P" }3 z                perror("open error");
: r0 |" V# Z3 g& a$ q, u8 E                return -1;$ P9 D9 m/ G! r7 [3 Z
        }
9 |) u% y' W! A! R) ?        
: ]8 x" z; D9 o/ [  f& l% @        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, e: e" L% }, l  R# l

$ ^  p$ U, F6 M; j& m        while(1)
% N* N8 \. T7 x% N1 x4 T        {# T* {4 Y  _" }& l1 L% n1 d% I: ^
                read_MSG_buffer(mem);$ f5 y: h1 ?4 z& s
        }                . h2 o1 Q/ K: Y% h* b7 c
}! y! {! \, J9 e# \3 w( E
# _( R( c2 n0 @9 R1 ?5 \9 @
void read_MSG_buffer(int *baseaddr)
0 o, ~2 t8 K) a4 O% `6 k4 m8 X( U{
0 e" B2 b+ z5 ^$ d, p% f        pRX_MSG_PROTOCOL pshreRAM = NULL;1 }0 D7 R8 m/ V2 V" a, ]" e

7 f. L2 E4 `) n        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- _" x0 K2 G& F+ ]! Z! B  }6 W  m* X& C- v  b" `; a2 q
        if(pshreRAM->packet_cout != count_copy)
/ _: S$ d: n$ e5 Y- P* G  S        {
2 X( p4 {: T) n: S; W                printf("a is %d\n", pshreRAM->a);5 `0 w) h% Y7 ?4 a$ `' d! n
                printf("b is %d\n", pshreRAM->b);5 g( s  P9 v1 i+ m9 H
                printf("count is %d\n", pshreRAM->packet_cout);
6 E2 H( l( \8 X1 G* }+ G                count_copy = pshreRAM->packet_cout;
# Q5 G8 {: r3 B+ P        }1 ]/ ~) G) _& s- y1 L' {
        else
* ~6 S# B$ t& h  y7 v2 @7 K        {; C/ W; W  R5 U' f$ ?0 p/ e
                printf("No effective message!\n");1 g; G5 {, L! D, J0 n" H
        }' ]1 K5 l: K0 }4 n$ U) P! d
}0 ?1 c+ b8 y9 D* N" r

5 a1 N9 Z$ {, B/ }" Y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 @. l' f5 G9 u! U8 Y* E  C4 P- S

% V) q/ `8 Z/ q3 m4 k) I9 c; Q# u! k* c
; T  R- z& E! w" Z

$ b% B  P2 K" t. m; h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-6-16 19:01 , Processed in 0.037212 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表