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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . l! Z/ _# i7 g7 o; e3 ^1 i, o) Z

: v: P/ ]8 W  `/ B# |4 o* x  BOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 l3 i2 l7 A0 Z0 ?# Y; g" ]#include <unistd.h>
2 K0 P* C0 @* Y& Z: l- k#include <sys/mman.h>
5 z0 r3 {& b8 o2 k" [- c5 Z#include <sys/types.h>
; L( f# w6 k2 ?7 C  h#include <fcntl.h>
% X" q# G5 j" i' H# c0 x/ ^; ]- k+ @! u$ d" V; m" @
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! A. i$ S; B+ E* F
3 a5 J8 E+ a& {9 w% @
typedef struct
3 I5 S% f- A1 X7 a; v{
5 Y8 H/ U0 Y' n9 Q* V$ D/ k; o9 L        unsigned int a;0 B/ E- F+ r; g
        unsigned int b;
6 L4 ]; z! Q! U0 D* {        unsigned int packet_cout;; r& r8 K/ o* a4 M' p* T0 ]- i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 w) r- Q+ N# {5 m, x
2 Q/ ^( ^' A* T# D9 F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" N" Z1 b! G) d; m' M. m
unsigned int count_copy = 0;
  V) P3 U, e3 X4 w9 W3 h; A9 \
. y3 u8 v3 S' E% t  B6 K: i1 ?% w: D# H1 Z, O  b$ L) G
int main()  O- E- p; E5 B/ o
{* H7 y  s( x& }1 f/ m/ L
        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 D. v. S; A4 r6 g6 @! X; S        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 o$ M! G. a' a. A) E9 D' P# M
& n, |# [2 C' g8 \* ?        while(1)
8 ^* y$ J6 K1 t: p        {
( \& ~  S* t% C& R/ v- u                read_MSG_buffer(pshreRAM);
3 E1 T/ S! q% x8 K" V        }               
4 l: x: _* f* P& N4 u}1 R+ i8 q% {5 K

, G# `- ^3 q; I2 M: P4 Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  D& W3 W' q! v2 l4 a# p{
' C2 V1 o- x; `: s3 _/ L+ l. P) ?        RX_MSG_PROTOCOL buf;
& @0 y! d/ y  ]9 Y( K; ^+ F        
! {0 \; l9 o5 e5 [2 V& g) N        buf.a = pshreRAM->a;4 a6 I8 i8 _$ l
        buf.b = pshreRAM->b;
: |3 t; p0 c) i3 l6 D        buf.packet_cout = pshreRAM->packet_cout;
+ q7 q& a$ @0 r! X5 g: B% [/ Z. S; B        - K7 e( v9 i& x, U1 F7 @
        if(buf.packet_cout != count_copy)
4 d8 ]* `* C* i* s- T        {
0 c: F0 K& `6 Y1 }: i                printf("a is %d\n", buf.a);
/ {# @+ m5 `- g% k                printf("b is %d\n", buf.b);* C$ o4 ?0 }. V% L+ L0 I
                printf("count is %d\n", buf.packet_cout);
6 W$ Z  {- |# `0 c2 g                count_copy = buf.packet_cout;: o) J1 j8 ~/ i0 W  Z/ ?
        }; P1 q9 c  |# O8 G8 F
        else
$ p7 ]+ I: l  S* w6 A. P# `        {
: _7 N) L9 m+ W: M                printf("No effective message!");
9 q% o) h' s8 x) X0 O9 n- d: z5 q        }4 d( }) @7 Z6 \& H6 \! i$ p3 W! `
}3 w& x* ~- s$ D( W! W" Y5 k

' r2 v: u/ o' c, u$ y; \5 ?
4 L! S9 [8 f8 l但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 r5 z  ^6 g1 s9 \0 [使用下面代码,对内存使用了mmap函数后:
  c/ \6 n1 ?6 `% L8 U) _% u/ M: d#include <stdio.h>5 h+ E* u" `  C. o
#include <unistd.h>
/ U; s; m/ x- S$ t% O#include <sys/mman.h>' I5 M; {" y; C6 ]" k* C9 M
#include <sys/types.h>
) s9 p) ?) x% t6 o# I#include <fcntl.h>0 m+ ]& F8 M, l0 ?# d- M
' J. P& R& L, d) p* `& f
#define SHAER_RAM_BASE_ADDR    (0x80000000)
+ ~; @; S& b: q- K#define SHAER_RAM_SIZE         (0x20000)   
7 l5 R, R  r/ x% }" j# P) z- F1 M& t2 |' M7 Z3 c  D' [
typedef struct$ X  S6 ~* n, E; W; Y
{
% v4 s0 t6 F0 H0 N' |% i; H        unsigned int a;
+ L2 x* b5 f5 I        unsigned int b;
: A$ ^0 Q6 V  q, l( Q* o        unsigned int packet_cout;0 k; ?4 `8 C6 @$ I, }0 f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& H' W" Y1 }. f, Q4 j* Q

, F5 \4 W) ^' y5 ^3 G2 ?5 Pvoid read_MSG_buffer(int *baseaddr);
% C4 L* _/ N, _# D" r$ Yunsigned int count_copy = 0;8 p1 A: N2 ^; [+ T: T
6 S9 I+ X! t& p8 L
int main()
8 ~* y+ @& h' M+ M0 {{
. \3 L; S' G4 h9 U+ R        int fd;; O" E8 v5 l: L+ ~1 y/ q8 h
        int *mem = NULL;9 _! H5 c0 L: U9 O; {/ h2 [
* ^6 a" @# D8 o) @& {  f- w
        if((fd = open("/dev/mem", O_RDWR)) <0)0 N, X. W+ i) I( [; _! D1 u
        {) Q4 {. f% f8 Q8 T/ o
                perror("open error");, c& P: t& m- \+ h9 t/ g2 W' f
                return -1;
  x: F- C% ^- l, t3 y6 L        }8 v: s% h- y( K; D$ _# F  ?6 u
        
9 r8 d. s7 z# ~" o        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- ^2 r  J! l" c! k0 F& d8 J  F# y

/ f9 j3 r; _3 z. N3 S        while(1)# [, M& [- o3 F. x2 J( M
        {
2 S, w9 C- B! s/ {7 }* W                read_MSG_buffer(mem);2 o- s# m# w6 K9 ^9 J8 [5 D* m
        }                6 S& s% l' m% u+ f
}# r5 e$ x& d0 g. u1 }2 u
1 ?# B3 W" L+ w
void read_MSG_buffer(int *baseaddr)  |/ j& O; B- b9 Y5 [. O
{
5 l7 ~% M* C$ V8 D8 p& |        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ e( B( _' u: M" p+ W5 L. G) o8 h3 ~; q+ U% B1 @
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 w$ q. \" |/ z6 }

3 W. Q- }" Z7 J4 d; S        if(pshreRAM->packet_cout != count_copy)# B. I  b. u/ V/ o
        {% ]% E. U3 t% L) W% L$ h" f0 t! }
                printf("a is %d\n", pshreRAM->a);0 s2 f( e( d! K
                printf("b is %d\n", pshreRAM->b);- o5 s! p" q  `1 T& a. p2 ]
                printf("count is %d\n", pshreRAM->packet_cout);
5 C, u4 x( c8 r* |* R7 h                count_copy = pshreRAM->packet_cout;
: [+ K5 n& x. l        }
" g4 @. U  I3 ?5 p4 C0 C9 L# \/ h        else* P& Z, I8 b  V" q5 e1 B; s
        {
* u  j& a/ ]  K6 H4 |                printf("No effective message!\n");8 l+ ?4 j! T) H3 I! ~  Q3 n: e/ A
        }
7 Q+ V7 ^1 B$ Y0 p, ?}! B* B& @4 w% H! c% H; v, T
- e( s1 F: O, ?# u4 \- \" _
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???8 t4 Q1 x& V& t! w$ v
) r0 f! `. h0 N8 E, N) l

  f- K. B* I+ q& P3 a. P" L9 [2 V- Z/ m

5 M$ W' t8 S  q4 e/ Q3 m3 z" Z, W% G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-25 23:21 , Processed in 0.048645 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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