概述 基于 Cortex-M3 内核的 STM32F103 系列单片机, 并没有浮点运算协处理器 在 STM32F103 上进行的浮点运算都是软件模拟实现 考虑到加入浮点运算库需要大约 10K 左右的 FLASH 空间 ( 即 <math.h> 对应的数学库 ), 而且浮点运算速度较慢,EC30-E

Similar documents

考 纲 解 读 14 浙 江 省 普 通 高 考 语 文 科 考 纲 研 读 吴 美 琴 今 年 的 考 试 说 明, 我 用 了 八 个 字 进 行 概 括, 那 就 是 稳 中 微 调, 关 注 生 活 稳 中 微 调 :14 年 的 语 文 考 试 说 明 是 近 几 年 来 调 整 幅 度

lim f(x) lim g(x) 0, lim f(x) g(x),

河 南 蓝 皮 书 文 化 (2008) 网 络 文 学 主 要 是 指 在 网 上 原 创 的 文 学 作 品 作 为 网 络 文 化 的 主 力 部 分, 网 络 文 学 的 发 展 在 近 年 来 势 不 可 挡 作 为 凭 借 新 兴 媒 介 兴 起 的 文 学, 网 络 文 学 与 传 统

21 flash

《將進酒》

电机与电器专业人才培养方案实施保障.doc

untitled

(Microsoft Word - Motion Program \270\305\264\272\276\363 \307\245\301\366 \271\327 \270\361\302\367.doc)

chap07.key

1abcd.doc

新・明解C言語入門編『索引』

CC213


考 研 数 学 三 部 曲 之 大 话 高 等 数 学 0. 考 研 数 学 高 等 数 学 部 分 其 实 就 是 一 座 大 楼 房 间 80 房 间 80 第 八 层 房 间 80 房 间 804 房 间 805 房 间 70 房 间 70 房 间 70 第 七 层 房 间 704 房 间 7

07_機械設備與安全 [相容模式]

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

Microsoft Word - 孙洪祥论文.doc

Microsoft Word - em78 sub program.doc

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

Microsoft Word - 8. 以通俗之教化民成俗:晚明经学家郝敬《圣谕俗讲》.doc

终端安全2

终端安全10


untitled

(京)新登字063号

四川省普通高等学校


EC( )19 第 2 頁 理 由 3. 致 力 推 動 香 港 與 內 地 澳 門 以 及 台 灣 建 立 更 緊 密 的 合 作, 並 一 直 在 這 方 面 擔 當 統 籌 協 調 和 推 動 的 角 色 就 內 地 事 務 而 言, 是 香 港 特 別 行 政 區 ( 下 稱 香

C语言的应用.PDF

<4D F736F F D CDF8C2E7B9A4B3CCD7DBBACFB8C4B8EFCFEEC4BFBDE1CFEEB5E7D7D3B0E6C9CFB1A8B2C4C1CF E646F63>

运用多媒体提升实验教学有效性的研究.doc

附件1

nooog

C/C++ 语言 - 循环

untitled

,, :, ;, , ,;, ; (CIP) /. :, ( ) ISBN X CIP (2003) : : : ( 029 )

第一章三角函数 1.3 三角函数的诱导公式 A 组 ( ) 一 选择题 : 共 6 小题 1 ( 易诱导公式 ) 若 A B C 分别为 ABC 的内角, 则下列关系中正确的是 A. sin( A B) sin C C. tan( A B) tan C 2 ( 中诱导公式 ) ( ) B. cos(

第二节 换元积分法

untitled

Microsoft Word 选题

Table of Contents

概述

SylixOS nbench 性能对比 修订历史版本 日期 原因 V /07/24 创建文档 V /11/29 修改文档模板 i


FY.DOC

5-2微积分基本定理

8.2 (Running In) 2000~3000 min -1 30dmN ~2000 min ~2000 min - 1 dmn ~ 1000 min - 1 (whipping) 500~1000 min -1 dmn min

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc


深 耕 水 里 傳 承 創 新 113

数学分析(I)短课程 [Part 2] 4mm 自然数、整数和有理数

数值代数 夏银华 中国科学技术大学

乎 是 白 白 净 净 的 样 子 她 看 到 那 个 少 年 揉 着 自 己 撞 在 路 灯 上 的 脑 袋 走 到 了 许 涵 今 面 前, 似 乎 是 说 了 一 些 什 么 话 的 样 子, 给 了 许 涵 今 一 个 包 着 的 小 小 的 包 裹, 抱 了 她 一 下, 又 跌 跌 撞

Java

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

Achieving One TeraFLOPS with 28-nm FPGAs

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

JLX

Introduction to Computer Systems /18-243, spring st Lecture, Jan. 12th

Microsoft Word - EE-185_cn.doc

C/C++语言 - C/C++数据

untitled

untitled

新版 明解C++入門編

untitled

untitled

Chapter #

Microsoft Word - 連啟元.doc

D2 17/10 食 完 早 餐 去 中 山 陵 和 明 孝 陵, 灵 谷 寺 到 景 区 的 巴 士 : 游 1 游 2 游 路 ( 票 价 在 1-2 元 间 ) 三 个 地 点 中 间 凭 门 票 免 费 乘 坐 景 区 小 火 车 往 来 晚 上 有 力 气 的 话 去 夫 子

DataWindow

NEXT SDT2.51 C:\ARM251 SDT2.51 ARM SDT 2.51 ARM PROJECT MANAGER SDT 2

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

Copyright iresearch Inc. 1

<433A5C C41646D696E F725C B746F705CBBFAB5E7B9A4B3CCD1A7D4BA C4EAB9A4D7F7D7DCBDE1BCB C4EAB9A4D7F7D2AAB5E32E646F6378>

1988

untitled

学习MSP430单片机推荐参考书

iresearch Copyright iresearch Inc. 1

让劳模插上腾飞的翅膀 为社会培养高技能人才

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

头部

华恒家庭网关方案

第 2 頁 建 議 2. 我 們 建 議 由 2013 年 7 月 1 日 起, 把 事 務 局 1 個 首 長 級 乙 級 政 務 官 編 外 職 位 ( 首 長 級 薪 級 第 3 點 ) 轉 為 常 額 職 位 ; 以 及 保 留 1 個 首 長 級 丙 級 政 務 官 編 外 職 位 ( 首

第7章-并行计算.ppt

C

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7.

目 录

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc

untitled

untitled

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

济南大学计算机科学与技术专业发展规划

WINAVR 中文教程

Practice_Leaflet_Chinese_Simplified.indd

Microsoft Word - WAFS BUFR航空?据的解?及可?化研究.doc

csg(1_29)cs.p65

Microsoft Word - 11.doc

<4D F736F F D C4EACAA1BCB6CDF8D5BEC6C0B9C0B1A8B8E62E646F63>

Transcription:

基于 EC30-EKSTM32 扩展浮点运算 CREATE: 2010/08/05 UPDATE: 2010/08/05 GUTTA Ladder Editor Version 1.1 Version 1.1 http://www.plcol.com http://www.visiblec.com 概述... 2 指令描述... 2 +R... 2 -R... 2 *R... 3 /R... 3 SQRT... 3 SIN... 4 COS... 4 TAN... 4 LN... 4 EXP... 5 MOVR... 5 DTR... 5 ROUND... 5 TRUNC... 6 实现代码... 6 测试... 9 相关下载... 10 COPYRIGHT 2010 WWW.PLCOL.COM 1 / 10

概述 基于 Cortex-M3 内核的 STM32F103 系列单片机, 并没有浮点运算协处理器 在 STM32F103 上进行的浮点运算都是软件模拟实现 考虑到加入浮点运算库需要大约 10K 左右的 FLASH 空间 ( 即 <math.h> 对应的数学库 ), 而且浮点运算速度较慢,EC30-EKSTM32 的指令集不包含浮点运算以及相关的转换指令 GUTTA 软件平台有对浮点数的完整支持 如果您希望 EC30-EKSTM32 支持浮点运算, 可以借助 C 语言二次开发接口, 在原 EC30-EKSTM32 系统上轻松的扩展浮点运算 借助本工程, 您可以不用编写任何 C 代码, 就让 EC30-EKSTM32 支持浮点运算, 你只需要 : 将项目提供的 ManagerFun.xml 文件替换掉 GUTTA Ladder Editor 软件安装目录下 \GuttaLad\EC30-EKSTM32\ManagerFun.xml 文件 将项目提供的 EC30-EKSTM32.hex 程序文件通过 GUTTA Flash Utility 软件下载到 EC30-EKSTM32 内核中去 只需要完成这两步, 更新后的 EC30-EKSTM32 内核便支持浮点运算了 这里对这个开发项目做详细说明是为了大家深入理解 C 语言二次开发的工作方式, 方便大家做其他扩展 指令描述 +R +R IN1, OUT 实数加法指令将两个 32 位实数相加, 并产生一个 32 位的实数结果 在 中 : OUT = IN1 + IN2 在 中 : OUT = OUT + IN1 -R -R IN1, OUT 实数减法指令将两个 32 位实数相减, 并产生一个 32 位的实数结果 COPYRIGHT 2010 WWW.PLCOL.COM 2 / 10

在 中 : OUT = IN1 IN2 在 中 : OUT = OUT IN1 *R *R IN1, OUT 实数乘法指令将两个 32 位实数相乘, 并产生一个 32 位的实数结果 在 中 : OUT = IN1 IN2 在 中 : OUT = OUT IN1 /R /R IN1, OUT 实数除法指令将两个 32 位实数相除, 并产生一个 32 位的实数结果 在 中 : OUT = IN1 IN2 在 中 : OUT = OUT IN1 SQRT SQRT 平方根指令对 32 位实数 IN 取平方根, 并产生一个 32 位的实数结果 OUT COPYRIGHT 2010 WWW.PLCOL.COM 3 / 10

2 OUT = IN SIN SIN 正弦指令对角度值 IN 进行三角运算, 并将结果放置在 OUT 中 输入角以弧度为单位 OUT = sin (IN) COS COS 余弦指令对角度值 IN 进行三角运算, 并将结果放置在 OUT 中 输入角以弧度为单位 OUT = cos (IN) TAN TAN 正切指令对角度值 IN 进行三角运算, 并将结果放置在 OUT 中 输入角以弧度为单位 OUT = tan (IN) LN LN 自然对数指令对 IN 中的数值进行自然对数计算, 并将结果放置在 OUT 中 OUT = ln (IN) COPYRIGHT 2010 WWW.PLCOL.COM 4 / 10

EXP EXP 自然指数指令对 IN 中的数值进行自然指数计算, 并将结果放置在 OUT 中 OUT = exp (IN) MOVR MOVR 移动实数指令将 32 位实数从输入双字 IN 移至输出双字 OUT, 不改变原来的数值 DTR DTR 双整数至实数指令将 32 位带符号整数 IN 转换成 32 位实数, 并将结果置入 OUT 指定 的变量中 ROUND ROUND 实数至双整数 ( 四舍五入 ) 指令将 32 位实数 IN 转换成 32 位带符号整数, 并将结果置 入 OUT 指定的变量中 如果小数部分等于或大于 0.5, 则进位为整数 COPYRIGHT 2010 WWW.PLCOL.COM 5 / 10

TRUNC TRUNC 实数至双整数 ( 舍去小数 ) 指令将 32 位实数 IN 转换成 32 位带符号整数, 并将结果置 入 OUT 指定的变量中 只有实数的整数部分被转换, 小数部分被丢弃 实现代码 首先, 我们需要在 GUTTA Ladder Editor 的指令系统中加入这些指令 加入这些指令可 以通过修改 GUTTA Ladder Editor 软件安装目录下的 \GuttaLad\EC30-EKSTM32\ManagerFun.xml 文件来实现 这个文件的具体描述可以参考 UM4003 指令描述文件规范 这个文件 即使是添加的内容, 也超过 10 页, 这里不打算列出, 需要了解详情请参考项目中的 ManagerFun.xml 文件 下面我们来看看二次开发项目中的 main.c 文件 #include <math.h> #include "system.h" #include "stm32f10x.h" void excute_addr void excute_subr void excute_mulr void excute_divr void excute_sqrt void excute_sin void excute_cos void excute_tan void excute_ln void excute_exp void excute_movr void excute_dtr void excute_round void excute_trunc uint32_t main(uint32_t action, uint32_t param) { switch (action) { COPYRIGHT 2010 WWW.PLCOL.COM 6 / 10

case CUSTOM_LGC_INS_DISPATCH: switch (param) { case 280: excute_addr (); return RT_OK; case 281: excute_subr (); return RT_OK; case 282: excute_mulr (); return RT_OK; case 283: excute_divr (); return RT_OK; case 284: excute_sqrt (); return RT_OK; case 285: excute_sin (); return RT_OK; case 286: excute_cos (); return RT_OK; case 287: excute_tan (); return RT_OK; case 288: excute_ln (); return RT_OK; case 289: excute_exp (); return RT_OK; case 290: excute_movr (); return RT_OK; case 291: excute_dtr (); return RT_OK; case 292: excute_round (); return RT_OK; case 293: excute_trunc (); return RT_OK; break; return RT_CANCEL; void excute_addr(void) { *(float*)ap(1) += *(float*)ap(0); void excute_subr(void) { *(float*)ap(1) -= *(float*)ap(0); void excute_mulr(void) { *(float*)ap(1) *= *(float*)ap(0); void excute_divr(void) { *(float*)ap(1) /= *(float*)ap(0); COPYRIGHT 2010 WWW.PLCOL.COM 7 / 10

void excute_sqrt(void) { *(float*)ap(1) = sqrtf(*(float*)ap(0)); void excute_sin(void) { *(float*)ap(1) = sinf(*(float*)ap(0)); void excute_cos(void) { *(float*)ap(1) = cosf(*(float*)ap(0)); void excute_tan(void) { *(float*)ap(1) = tanf(*(float*)ap(0)); void excute_ln(void) { *(float*)ap(1) = logf(*(float*)ap(0)); void excute_exp(void) { *(float*)ap(1) = expf(*(float*)ap(0)); void excute_movr(void) { *(float*)ap(1) = *(float*)ap(0); COPYRIGHT 2010 WWW.PLCOL.COM 8 / 10

void excute_dtr(void) { *(float*)ap(1) = (float)(*(int32_t*)ap(0)); void excute_round(void) { *(int32_t*)ap(1) = (int32_t)(*(float*)ap(0) +.5f); void excute_trunc(void) { *(int32_t*)ap(1) = (int32_t)(*(float*)ap(0)); 由于添加浮点运算不涉及任何硬件操作, 这里我们只需要响应指令派发消息 CUSTOM_LGC_INS_DISPATCH 即可 280 ~ 293 是这些指令对应的指令号, 这些指令号通过 ManagerFun.xml 文件传递给 GUTTA Ladder Editor 软件 若在 GUTTA Ladder Editor 中编辑了这些指令,GUTTA Ladder Editor 最终会将这些指令号连同操作数一起下载到 EC30-EKSTM32 的 PLC 程序区 EC30-EKSTM32 的 PLC 解释系统若发现指令号大于或等于 224, 则会尝试向用户二次开发程序发送 CUSTOM_LGC_INS_DISPATCH 消息 在 CUSTOM_LGC_INS_DISPATCH 消息的处理函数中, 我们根据指令号 param, 分别调用对应的指令处理函数 由于这些指令都只涉及简单的数学运算, 实现非常简单 需要特别感谢的是 IAR 自带的数学运算库 一般说来, 标准的 <math.h> 数学库只需要实现双精度浮点运算 (double) 即可 IAR 提供的数学运算库, 不但有标准的双精度浮点运算, 还特别提供了精简版单精度浮点运算 (float), 这些函数需要在标准的函数名后加上 f 后缀 也正因为如此, 二次开发的工程在编译后, 体积不到 10K 下面是 link 信息文件的纪录 7 224 bytes of readonly code memory 16 bytes of readonly data memory 88 bytes of readwrite data memory Errors: none Warnings: none 测试 将项目提供的 ManagerFun.xml 文件替换掉 GUTTA Ladder Editor 软件安装目录下 \GuttaLad\EC30-EKSTM32\ManagerFun.xml 文件 打开软件 GUTTA Flash Utility 选择二次开发项目生成的程序文件 EC30-EKSTM32.hex, 通过串口将这份程序下载到试验板 EC30-EKSTM32-EVAL COPYRIGHT 2010 WWW.PLCOL.COM 9 / 10

打开项目自带的测试程序 ProjectForKeil-newlib-FloatSample.vcw, 进入连线状态, 通 过改变每条指令的输入参数, 测试每条指令是否工作正常 相关下载 浮点运算二次开发项目下载 : ProjectForKeil-newlib-FloatSample.zip COPYRIGHT 2010 WWW.PLCOL.COM 10 / 10