OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 E* D1 m8 `  O; c# v/ e" g0 P) x) @/ V5 X" U) [/ K4 X
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' n6 G) ~6 y! v" m8 l! Z* ]0 A
#include <unistd.h>: c1 v& ~3 ]# l% D% b" L* C: U
#include <sys/mman.h>
1 k3 ~. M* k% b% ]8 b#include <sys/types.h>: i9 O5 k! K7 c; i+ o* J& w. V$ Z
#include <fcntl.h>" l1 B2 `& C* i
+ \3 V/ d8 x: i* d% T# Z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 }2 B% q, K" d9 H
8 j* W; \! [* M' c# Btypedef struct& N- P- `7 `) E5 v: M  a7 \$ ?* f
{
& M" Z9 R: N/ o1 O$ m4 a+ ]        unsigned int a;" e# }* j" y7 r- W
        unsigned int b;
  I) g: q- b) P/ l        unsigned int packet_cout;$ d# [6 W1 _& b% a6 N9 E, i" d& H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 l% ]* K7 q6 _3 x( y- ^% x
4 d0 m- M9 @; _# @. kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 u8 k* g: e: A/ s5 K+ ]2 F' k
unsigned int count_copy = 0;
0 t& S6 K. u1 |2 x2 C" d" q- G4 J3 s- r8 h- \

0 e5 g9 ~* s! fint main()
1 T2 ^' J4 f; t9 o# E/ T{
9 P+ {' q/ e2 ], Q$ B        pRX_MSG_PROTOCOL pshreRAM = NULL;
, G8 V% r3 \# @# c        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( g+ N- m4 z; G5 k* g
% p. h0 ~7 Y" `/ y
        while(1)! u; y& L# E* a% _
        {
0 d/ K6 K8 ~: T7 y  Z5 I6 e9 U8 F                read_MSG_buffer(pshreRAM);
5 u- _9 c8 W! l' p6 O4 L        }                " i4 `3 W. L/ Q
}7 O; f* q/ x; S. `

: F( g/ g' f3 P6 u" @& M$ pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% w7 N$ U: D! X" }3 b2 X- |! e% [{7 L' @  Z% h4 Z6 Q' t5 m- B2 r3 d
        RX_MSG_PROTOCOL buf;* p, Y8 l" m+ J! I! d, e
        
, H7 @  n; S+ ~1 {4 f9 A0 |7 ]2 S        buf.a = pshreRAM->a;
$ m4 g; f* Q. \- E        buf.b = pshreRAM->b;
- w, s0 G. \8 Q# q8 S' I9 ?4 t        buf.packet_cout = pshreRAM->packet_cout;
5 n% F3 q1 u3 ^! K        
- V) g1 C$ H4 w* X% ~6 p        if(buf.packet_cout != count_copy)
0 z; Y5 c  v  J/ ^: l        {9 w: X  z! {8 s7 k+ l& T- m
                printf("a is %d\n", buf.a);7 t* k  F' D, m
                printf("b is %d\n", buf.b);3 V8 c- M% B8 Z
                printf("count is %d\n", buf.packet_cout);
4 u/ r( x( P: p' V& T* h4 M4 n                count_copy = buf.packet_cout;: ]4 o, h/ D& h, O( ?
        }' [/ l# X& \( _3 M1 l# W$ }
        else
9 b9 r/ W0 T, J+ k; n& w2 X        {! E/ B4 N" }6 g: g9 c! b
                printf("No effective message!");( b( y7 L9 w5 n$ c6 V
        }
& W$ f9 b% U+ b) ]}  u6 b0 V* u6 ?* h$ U0 k! w
1 D  d5 w4 i( r! J9 D

) i9 `; U3 S7 a& E3 j% q' [2 Y- S但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ a; ^7 D/ o! B" G. W+ y# S
使用下面代码,对内存使用了mmap函数后:
' T2 n: L: z7 A" a: v2 d#include <stdio.h>: ]  z( Z* `6 U; ^7 F
#include <unistd.h>
. N7 M, N6 Q0 j% Y6 l* E6 `+ ^2 p' \#include <sys/mman.h>
& V+ `- j0 m2 v6 ?#include <sys/types.h>
3 i3 B; z$ Q4 S#include <fcntl.h>8 O3 x2 l$ z0 J6 h/ r# g: E
3 h0 P( P& [& x1 B
#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 y: \1 B% y* X" j0 b: m#define SHAER_RAM_SIZE         (0x20000)   5 X1 b. G  K0 c+ w$ g2 V9 Q% o; @
6 @. P: {$ }# y( E8 h
typedef struct' ^' u4 D  U  N7 z( p- w  R
{$ H$ L# W. u, t5 g
        unsigned int a;
+ P+ V$ B; K. u8 z) ]        unsigned int b;; p' e7 ^9 d/ C. t( N; _
        unsigned int packet_cout;
2 T7 M" s( s+ o% N# \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. m: P: a% j) A  `6 t0 d+ ~8 M

3 ?4 ?. D* J% r" d6 c3 c) j$ ?2 Svoid read_MSG_buffer(int *baseaddr);
* I& g. n6 r& i) p0 D% \6 Z+ {unsigned int count_copy = 0;- q- K1 l% T  l  _

  |7 F2 `! l1 [$ C, U, Oint main()1 I. ^% ^+ x# m1 v2 y7 f
{4 b# T" U: ~  L0 O+ E' c5 l
        int fd;8 L5 f- P% G0 l  ]) \; ^
        int *mem = NULL;9 J. R/ m' J3 L; P* {

" \: k3 ^/ @7 ]- r* q9 @& ^        if((fd = open("/dev/mem", O_RDWR)) <0)
3 r; k  X" r9 n1 ~8 m  T1 o        {- y- x/ C4 `1 e
                perror("open error");
9 Z: `6 H5 A; ~, v3 e8 J: R                return -1;
; [3 F* D1 J! ^        }5 n9 i2 B1 M* j# S2 ~0 u. o$ w
        
: p$ k5 q6 d- |        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' c/ V% f' O3 P6 T5 F
% O  z+ s7 Q  E# H* x* ]        while(1)
) Y/ Z+ S4 m+ H# V9 e8 [# F        {. Y3 i9 J4 N! k0 s
                read_MSG_buffer(mem);
* `" U, j# T+ A& P( u# ^        }                3 j0 V* ^& _% F  o
}
: j7 b! M' a* \" R' C- D) V
- D/ D8 Z: w! y8 V1 U/ r8 Zvoid read_MSG_buffer(int *baseaddr)
$ X2 j9 j% m+ M0 }9 V{6 e/ {* E7 p6 A
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 x% D: k( L5 z" z4 z
& z7 B) Y( e1 a) h
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 v* H" a2 p% f& C3 P- i! S# |
- s; Q& [: D6 B+ i/ \& z: G7 h
        if(pshreRAM->packet_cout != count_copy)
- f' y/ L- N) G: G( V        {3 r5 \8 {! _/ I; D3 y6 F
                printf("a is %d\n", pshreRAM->a);: Q3 E' A9 [$ E. ]
                printf("b is %d\n", pshreRAM->b);; k, Q1 b( n. D  {6 w1 g  K
                printf("count is %d\n", pshreRAM->packet_cout);# y% S( k# t, O/ f* R/ N9 p
                count_copy = pshreRAM->packet_cout;
# E0 ~2 f  O' H) z        }& Z7 D$ r; q2 ^* [- L
        else
/ V7 Z  l3 }) K' M1 p/ `. o3 s        {3 |: u* R; e7 g' M
                printf("No effective message!\n");/ A7 q; ]/ C2 Q5 e
        }
! E& P1 B) x# F4 f- [}
& O( G' W* K8 f. I  Y. x2 O4 j% N
* ^" I( l) B; h/ Q7 r6 I没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 v3 q3 b6 Q8 p3 W' f: K: Y) ^
6 u1 B- y- z2 l( V, Y

) _! O; Y! R# ^0 \9 K
  L+ S) V+ w5 D" ]3 i9 Z
$ O& }/ \/ o% |  S% j2 p& [5 a/ l; |$ I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-3-11 00:57 , Processed in 0.041778 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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