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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  Z  Z/ r  Y: b1 P2 t* [: ~8 }/ @- W6 i' ?- ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& h" Z8 i0 G0 k5 W
#include <unistd.h>: s& n2 y) j1 o, p. O1 q8 K6 {
#include <sys/mman.h>
, C& x! }# E$ B) a; v; {+ f#include <sys/types.h>
2 ?: z! {8 e- z/ G, X$ |1 A#include <fcntl.h>" ~  _8 s; o) \( \6 j& K& S- Q

: [8 W2 ^2 p& Z0 l( O8 [8 f#define SHAER_RAM_BASE_ADDR    (0x80000000)   
. w3 `  p# S+ C; y9 @1 U4 Y( Z
( J# `2 N) d' B0 \, {1 dtypedef struct
7 Q3 c3 |* C( i{
& y3 c0 o; y6 e4 z2 q( m        unsigned int a;- M! Y/ E9 r% L; n6 K# Y' g
        unsigned int b;# _# F/ |( ?$ q2 p# b. A& G% Z
        unsigned int packet_cout;2 M) H# G' @& \! H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- d" C  V9 S' G: n' @
' @- j3 k9 y- xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);  W4 ^9 ?: r7 b; t/ l5 i
unsigned int count_copy = 0;' t' i+ J$ v9 [- [/ U+ @1 E4 h0 J

2 ?1 E# C  w2 X# P  ?6 b8 b" B
! H2 `; P7 f9 \" C' hint main()' p! a8 O; z$ v' l6 k# J
{
- l3 q; q* {0 p+ H5 p/ T        pRX_MSG_PROTOCOL pshreRAM = NULL;
% v, `- c/ _; Q! Y4 [: u        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 a6 Q* L' @, A5 R3 Z
* h9 P, R1 A. j$ o" A) Y        while(1)
/ \. m& s3 P  b* e" D: X: o# v5 @        {9 `3 H% n& f2 F; T3 ]
                read_MSG_buffer(pshreRAM);
7 h. a8 D# z# G6 U; Z        }               
& {( k( A, i! [" G}
" y2 q3 x: E4 h) L: F8 I1 t" ?/ E# I% s/ r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 W" ^- I3 E9 [# W( }6 G. @{" c# K7 F- f) S; L
        RX_MSG_PROTOCOL buf;0 e0 d% r! E6 J' [, J1 P
        
( V  S; K8 I" P% E( @        buf.a = pshreRAM->a;
; d& D8 V  L& t& \" U0 E        buf.b = pshreRAM->b;2 q1 O8 C" A- E$ c0 m3 t3 D# b
        buf.packet_cout = pshreRAM->packet_cout;, \/ s, F# ]8 k( E
        
6 z! ?8 @! T  R3 q8 |' E        if(buf.packet_cout != count_copy)
: c7 o' V, c9 \* u1 a- |, T        {) _! H0 e( o4 p( K: |
                printf("a is %d\n", buf.a);
* ~$ v: |& d. K: [7 }  }4 t                printf("b is %d\n", buf.b);. v7 `; a7 h$ ~4 U, y6 D
                printf("count is %d\n", buf.packet_cout);
  U0 v+ Q3 r% k) d: f6 A                count_copy = buf.packet_cout;
. j9 u+ n- s# |( j! O! ~. d        }" Y* W7 d% w$ P% D$ z0 Y
        else
  F0 f( C/ V4 c* A        {
6 `" {% y* Y9 A, W' ?0 `  S* N7 H                printf("No effective message!");- x( s9 J- n: ]0 K1 M- I
        }+ m4 ?' O7 T4 l1 z! [
}3 ?) z& U- h0 P9 ?; e8 F( A, \

& O6 f+ x4 |0 ]& Z; F5 y+ g1 C/ y1 V" l& n) k( n6 G7 F0 x7 E
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 k$ g" h8 e1 j: N# v' d使用下面代码,对内存使用了mmap函数后:
+ b0 U1 R, I. E% t, U#include <stdio.h>$ o, }8 l: r! p! p' S, C4 h
#include <unistd.h>' T: b5 \, D& }
#include <sys/mman.h># O. m! ~+ d- a  o* e- B
#include <sys/types.h>
- ^/ y8 M& V7 U0 p4 s#include <fcntl.h>) l; N& H" L' G5 u) p6 `

! a& T9 Z) n4 j& q#define SHAER_RAM_BASE_ADDR    (0x80000000)
/ k" ?1 J- W6 ~4 o#define SHAER_RAM_SIZE         (0x20000)   
  r1 {  j6 r8 l- w: o$ K9 n0 g" l3 y. b; \* O
typedef struct3 B# Y$ ?+ q" F& p* m0 R4 b9 E
{
& ]5 ^2 R. R& N" o4 S0 {6 N        unsigned int a;/ V* n5 s$ W/ R* t/ x# e  O
        unsigned int b;
# j+ K6 C5 y  ?: w' Z9 D) ^0 ]        unsigned int packet_cout;
$ x/ k5 H4 S4 ?( J4 s# Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  F; W2 O+ l, R" W+ C. b* T; j

4 v- h/ ]6 k. g0 K( Rvoid read_MSG_buffer(int *baseaddr);3 p# Z. w  F; T+ f6 f; b4 f7 ~  ]- z
unsigned int count_copy = 0;
" x, f3 s3 a7 Y( G8 p" ^/ Q
* @1 Y! l. [2 v! ~9 W. r1 q1 `& ~* V6 Aint main(). D- X' Q  F$ G* E
{$ A" w+ n* `$ q2 w) }
        int fd;
, ?. e% V  d8 w3 a- n1 B  ?        int *mem = NULL;
3 ]5 c9 S' D* P0 {# f
. Q# `! n5 W  x7 ]* Q; }        if((fd = open("/dev/mem", O_RDWR)) <0)
% y. a+ @$ x$ |        {
/ w7 g; g+ d( H6 F+ K                perror("open error");0 S1 z1 j- ?3 ^
                return -1;
+ o) x- e; A5 a0 x/ _  e        }
0 b: K2 ^; c) v7 v        4 [) c; j1 o! J$ y& H* n8 ~7 H
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 A' p8 k# C2 ~# a
! B7 a4 O% [' m4 O        while(1). o: ~' j9 u/ r5 g" G) s7 J
        {
1 Y0 `$ Q" {" C+ N                read_MSG_buffer(mem);6 A( y; j# o+ }
        }                / ~6 s, e, d& W* _+ O
}
3 j; g! {  y# J& j" K  y: }, O3 c) e0 V7 o1 k9 ?* u. K  N# q: R3 h
void read_MSG_buffer(int *baseaddr)
" e& h$ \& W  i3 V{
; K5 r4 i" y# k! ]  T        pRX_MSG_PROTOCOL pshreRAM = NULL;; A: i* F( d6 S6 d
+ e9 I8 q  l+ V
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: H" R3 K  q9 h# M8 r

! {# C0 p- D0 U) W0 ^9 n6 C5 N        if(pshreRAM->packet_cout != count_copy)5 a. m5 X0 `; m- l1 K+ \4 L5 L% N3 k3 C
        {5 i7 g+ K) x  F
                printf("a is %d\n", pshreRAM->a);! x! ^0 E; x# n4 T
                printf("b is %d\n", pshreRAM->b);% q/ \' X: v+ F7 a8 u" t2 U
                printf("count is %d\n", pshreRAM->packet_cout);0 V: s, \; n1 s! j% H" |
                count_copy = pshreRAM->packet_cout;! U. q. O* X+ w0 z# N1 ?) J/ K2 r
        }! Z) o3 u- @! L
        else
! {. Q' |' ]8 F$ }) {, h4 i        {
' {) e, T% ^9 s! x. c                printf("No effective message!\n");2 `$ M5 O6 _! M+ `8 P
        }; N8 K/ s* G# ~* _
}
6 k' B: N) E% I! o% X
5 ~1 w- Y6 l0 j0 K; B9 s* W: m没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 p: C5 z) Q9 v" T7 p

' k) V" o6 A& t- v" ~
/ Q. \/ |; l7 J2 X- S1 z. R! n+ P5 U7 Q7 `3 {) ^' E; v/ _
; l& V" n! G6 j" W" O/ Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-3 16:39 , Processed in 0.041838 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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