首页 » 通讯 » KIEL 调试,Cortex-M,Flash,KUKA机械人技能文章分享_数据_暗记

KIEL 调试,Cortex-M,Flash,KUKA机械人技能文章分享_数据_暗记

落叶飘零 2024-11-14 20:45:57 0

扫一扫用手机浏览

文章目录 [+]

程序中最主要的是什么,数据。
很多时候程序运行有问题和你的数据密切干系,如果你能实时不雅观察程序中的数据,你以为如何?

数据分为两种,一种是可变的,一种为不可变的。
比如 RAM 数据为可变的,FLASH 数据为不可变的(实际上也能改变,不然你怎么把程序烧写到 FLASH 中呢),还有一种极其分外的存在:寄存器数据。

KIEL 调试,Cortex-M,Flash,KUKA机械人技能文章分享_数据_暗记 KIEL 调试,Cortex-M,Flash,KUKA机械人技能文章分享_数据_暗记 通讯

01—变量查看

KIEL 调试,Cortex-M,Flash,KUKA机械人技能文章分享_数据_暗记 KIEL 调试,Cortex-M,Flash,KUKA机械人技能文章分享_数据_暗记 通讯
(图片来自网络侵删)

首先说说可变数据的查看办法,比如你声明的一些变量,可以通过 Watch 窗口查看。

通过以下办法可打开 Watch 窗口(任选一个窗口打开即可):

在这里可以查看变量(这里选择 Watch 1):

是否创造上面的显示不太对劲?<cannot evaluate>,这是啥意思?这个是解释 KEIL 无法找到这个变量。
就我所知,有两种情形会涌现这种征象:

1)、这个变量不存在:有可能你之前声明过这个变量,后来创造没用到,删除了。

2)、利用 static 声明的变量。

比如像这样的:

如果是第二种情形,那么可以通过将程序运行到利用该变量的地方,然后停滞就可以查看了。

添加变量:

那么如何添加你须要查看的变量呢?常日可以利用如下方法:

1)、光标处于变量位置,然后右击会涌现一个界面,末了选择添加到你须要的窗口……

查看原文:https://www.dianyuan.com/eestar/article-7888.html

Cortex-M系统中断延迟及其丈量方法

在嵌入式领域里,实时性是个常常被我们挂在嘴边的观点,这里的实时性紧张强调得是当外界事宜发生时,系统是否能在规定的韶光范围内予以相应处理,这个韶光阈值越小,系统的实时性就越高。
当然关于这个实时性,也有软硬之分,硬实时哀求的是设定的韶光阈值内必须完成相应,而软实时则仅需根据任务的优先级尽可能快地完成相应即可。

无论是 RTOS 环境还是裸机环境下,系统最原始的实时性保障实在来自于 MCU 内核的中断相应能力,关于中断相应能力有一个主要指标叫中断延迟韶光,本日我们就来聊一聊 Cortex-M 内核的中断延迟及其丈量方法:

一、什么是系统中断延迟?

所谓中断延迟,即从中断要求 IRQ 旗子暗记置起开始到内核进入实行该中断 ISR 第一条指令时的间隔,如下图所示, 箭头范围内的 11 个周期便是中断延迟韶光。
关于这个观点,ARM 公司专家 Joseph Yiu 的一篇博客 《Cortex-M内核系统中断延迟入门指南》 先容得很详细。

为什么会有中断延迟?实在这是无法避免的,当内核在实行 main thread 代码时,来了中断事宜,NVIC 里对应 IRQ 旗子暗记被置起,内核接到 NVIC 关照后压栈保存现场(以便中断 ISR 处理完成时回到被打断的 main thread 地方),然后再从中断向量表里取出对应中断 ISR 来实行,这一系列动作是须要韶光的。

Cortex-M 家族发展至今,已有 M0/M0+/M1/M3/M4/M7/M23/M33/M35P/M55 等多款内核,这些内核的中断延迟韶光不一,如下表所示。
把稳表中的数值单位是内核的时钟周期,并且是在零等待内存系统条件下结果(即代码链接在零等待内存里)。

Note1: 一样平常来说 MCU 内部与内核同频的 SRAM 是标准的零等待内存。
Note2: 许多运行频率超过 100MHz 的微掌握器会搭配非常慢的 Flash 存储器(例如 30 - 50MHz),虽然可以利用 Flash 访问加速硬件来提高性能,但中断延迟仍旧受到 Flash 存储系统等待状态的影响。

二、如何丈量系统中断延迟?

丈量 Cortex-M 的中断延迟方法有很多,任何一个带中断的 MCU 外设模块都可以用来测中断延迟,Cortex-M 中断延迟韶光跟触发中断的详细外设模块类型基本上是无关的(最多受一点该外设中断旗子暗记同步周期的影响)。

利用 GPIO 模块来丈量 Cortex-M 的中断延迟是最大略的方法,选择两个 GPIO,一个配置为输入(GPIO_IN),另一个配置为上拉输出(GPIO_OUT,初态设为高),开启 GPIO_IN 的边沿中断(比如低落沿),在 GPIO_IN 边沿中断 ISR 里翻转两次 GPIO_OUT,然后用示波器丈量两个 GPIO 旗子暗记边沿间隔得出中断延迟韶光。

uint32_t s_pin_low = 0x0;uint32_t s_pin_high = 0x1;void GPIO_IN_IRQHandler(void){ GPIO_OUT->DR = s_pin_low; GPIO_OUT->DR = s_pin_high; ClearInterruptFlag(GPIO_IN); __DSB();}

须要把稳的是在如上 GPIO_IN_IRQHandler 函数伪代码里,我们对 GPIO_OUT 做了两次翻转,这是有必要的。
我们随便选择一个 CM7 芯片去实际编译(IAR环境下,无优化)可以看到如下汇编代码,每一次翻转实际上由四条指令组成,我们作为计时基准的 GPIO_OUT 第一个边沿实在是 ISR 里实行了第一句翻转代码后的时候,而中断延迟是不包含第一句翻转代码实行韶光的。
由于指令流水线优化等繁芜情形,我们就不从理论上打算四条指令实际花费时钟周期数,直接再翻转一次 GPIO_OUT,丈量 GPIO_OUT 低电平时间即认为是这四条指令实行韶光。

因此终极中断延迟韶光 td = t1 - t2,个中 t1、t2 是我们可以丈量出来的韶光。
此外,td 韶光内包含了 tx,这个 tx 是 I/O 跳变旗子暗记到芯片内部 IRQ 置起的韶光,这个韶光是芯片系统所需的同步韶光,因芯片设计而异,本应不被打算在系统中断延迟内,但由于这个韶光无法丈量,故而就放在中断延迟里了,也算是一点小小偏差吧……

查看原文:https://www.dianyuan.com/eestar/article-7938.html

FlexSPI外设对AHB Burst Read特性的支持

痞子衡之前写过一篇关于FlexSPI LUT的文章 《从头开始认识i.MXRT启动头FDCB里的lookupTable》,这个LUT机制是i.MXRT上能够实现对串行NOR Flash进行AHB读访问的缘故原由(也是程序能够XiP原地实行的根本)。
那篇文章的末了留了一个小伏笔,即FlexSPI的Prefetch不使能,SEQ_CTL事情一次获取的数据由AHB Burst Read策略决定,那么这个Burst Read策略到底是什么?本日痞子衡来跟大家好好聊一聊:

一、什么是Burst Read?

提及Burst Read观点,实在也没啥玄机,中文直译就叫突发读取(实在有个更接地气的翻译:连续读取),这个观点要跟Single Read(或者Random Read)比拟来看。

对付一个NOR Flash器件而言,主设备(这里指i.MXRT)如果要读取它的内容,必须按照手册规定的读时序,这个读时序中肯定有我们要供应地址信息,这样Flash器件才能知道该把哪个地方的数据送出来。
在一次读时序中(一个CS拉低期间,发送一次地址信息),Single Read便是读取固定大小的数据(比如4bytes),而Burst Read可以灵巧调度读取数据的长度(一样平常来说用于一次读取更长的数据)。

二、AMBA AHB支持哪些Burst Type?

前面讲了,Burst Read可以灵巧调度读取数据的长度,即当前读时序内,地址信息发送完后,主设备想读多少byte数据相应输出所需的SCK时钟数即可(地址根据上次访问按序自增),那么主设备是不是可以任意输出SCK时钟呢?一样平常情形下是的,这种便是范例的线性递增类型(简称INCR)。

除了INCR类型外,还有另一种环抱类型(简称WRAP),这种类型下,主设备输出SCK时钟并不总是得到线性地址递增的数据,而是在一个指定长度数据块里不断循环,这种类型运用处景更多在RAM型器件(比如用于栈)。

下表是ARM官方 AMBA Specification 第 3.6 Burst operation 小节里关于Burst Type全部定义与阐明。
我们紧张关注INCR类:INCR4/8/16一次访问长度是4/8/16 data block (详细data block大小由HSIZE[2:0]决定),INCR即不定长度。

在 AMBA Specification 里找到关于HSIZE[2:0]定义如下,这个HSIZE是由AHB master根据访问自动设置的。

下图是范例的INCR型不定长Burst访问时序图,图中共有两次INCR型Burst:第一次INCR Burst共读取4bytes,Burst开始于HADDR = 0x20处,共发起了HSIZE = Halfword的两次传输;第二次INCR Burst共读取12bytes,Burst开始于HADDR = 0x5c处,共发起了HSIZE = Word的三次传输。

Note: HTRANS共有四种传输类型:IDLE、BUSY、NONSEQ、SEQ,前两种顾名思义,NONSEQ代表一次Burst的首次传输,SEQ代表一次Burst的后续传输。

三、FlexSPI对AHB Burst Read的支持

现在我们回到FlexSPI的LUT机制,在它的指令集关于读写序列的阐明里,特殊提到了当访问类型是AHB的时候,一次访问的数据长度取决于Burst Size和Burst Type。

Burst type一共有如下8种(实在对应了AMBA AHB Burst Type),Burst size也有8/16/32/64bits四种(即data block,未完备实现HSIZE[2:0]里定义的所有值),FlexSPI模块会自动相应AHB master访问要求来调度Burst type和Burst size去完成对应Flash的访问……

查看原文:https://www.dianyuan.com/eestar/article-7934.html

无缓存下对Flash的AHB读访问竟然是这样

上一篇文章 《i.MXRT中FlexSPI外设对AHB Burst Read特性的支持》 里痞子衡先容了FlexSPI外设在不开启Prefetch功能下相应AHB master的访问要求完备受AHB总线Burst Read特性决定,这是FlexSPI外设最根本的对Flash访问支持功能,研究这个实在是很故意义的,这可以反响出XiP下最原始的代码实行效率。

我们知道在实际项目中,XiP运用程序常常是在L1 Cache和Prefetch加持下运行的,代码实行效率会得到大大提升,但无论是若何的缓存策略,极限情形下(比如大数据块搬移,长跳转指令)终极还是拼得FlexSPI最根本的读访问支持。
本日痞子衡就从抓Flash旗子暗记波形角度带大家真切感想熏染下这最根本的AHB读访问环境(为更清晰地剖析结果,本次紧张涉及数据总线AHB访问,暂不涉及指令总线AHB访问):

一、实验准备

痞子衡用i.MXRT1050-EVKB来做这个AHB读访问实验,这块板子上的Flash被痞子衡改换过,目前的型号是华邦W25Q64JWS-IQ。
我们基于 \SDK_2.9.1_EVKB-IMXRT1050\boards\evkbimxrt1050\demo_apps\led_blinky\iar 例程(记得切换到 flexspi_nor_debug build)来大略修正一下,把启动头FDCB修正如下,设置Flash事情于30MHz Fast Read Quad I/O SDR模式,调成30MHz低速是为了方便后续用示波器抓Flash旗子暗记去剖析。

const flexspi_nor_config_t qspiflash_config = { .memConfig = { .tag = FLEXSPI_CFG_BLK_TAG, .version = FLEXSPI_CFG_BLK_VERSION, .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad, .csHoldTime = 3u, .csSetupTime = 3u, .controllerMiscOption = 0x10, .deviceType = kFlexSpiDeviceType_SerialNOR, .sflashPadType = kSerialFlash_4Pads, // Flash事情于30MHz .serialClkFreq = kFlexSpiSerialClk_30MHz, .sflashA1Size = 8u 1024u 1024u, .lookupTable = { // Quad I/O Fast Read SDR LUTs [4CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18), [4CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04), [4CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0x00), [4CMD_LUT_SEQ_IDX_READ + 3] = 0, }, }, .pageSize = 256u, .sectorSize = 4u 1024u, .blockSize = 64u 1024u, .isUniformBlockSize = false,};

下图是华邦W25Q64JWS-IQ芯片的Fast Read Quad I/O SDR传输时序图,Dummy Cycle连同MODE8_SDR序列一共6个SCK周期,此外还有个特殊把稳点,MODE8_SDR序列参数值须要被设成0xFx,我们上面修正的FDCB启动头是符合哀求的。

现在让我们把示波器拿出来,四路探头分别连到板载Flash器件的CE#、SCK、SI_IO0、SO_IO1引脚(IO2、IO3因探头有限就不抓取了,IO[1:0]足够我们剖析时序了),然后将 led_blinky 工程下载进Flash运行便可以不雅观测结果了……

查看原文:https://www.dianyuan.com/eestar/article-7933.html

KUKA KSS8.5/8.6 变位机 丈量 校准 配置

此前的文章,KUKA机器人与变位机参数配置(下),有解释转换数据和丈量方法,本篇得益于有KUKA Sim 4.1的加持,方便测试配置,瞬间就方便很多了。

KUKA KSS8.5/8.6 与 KSS 8.3 参数界面也不同了,但是事理依然相同。
这里利用的是KUKA两轴变位机DKP 400_V1。
机器转换数据:

基点数据:

一、基点丈量:1、变位机的RootFrame相对付机器人的RootFrame偏移。

2、在工具/基坐标管理--编辑运动系统,将上面的偏移位置输入即可。

二、运动的基坐标丈量

1、两轴变位机的水平旋转轴的旋转中央的FlangeFrame到机器人的RootFrame偏移。

2、直接输入丈量的数据给须要分配的基坐标,同时分配给变位机DKP 400_V1即可。

至此配置结束,须要变位机动作机器人TCP跟随动作,只须要将坐标切换为基坐标,同时选择对应的工具坐标和分配给变位机的基坐标,编程工具坐标和分配给变位机的基坐标……

查看原文:https://www.dianyuan.com/eestar/article-7904.html

更多精彩内容,尽在电子星球 APP(https://www.eestar.com/)

六篇技能文章,让你秒懂电容的脾气秉性

七篇DIY技能文章献给你,让你脑洞全开

五篇文章帮你开启DSP的学习思路

汇总篇:关于PID知识,重点在此

标签:

相关文章