如何在状态模式代码中为中断传递本地事件处理器
我转向了我的NetMF项目的状态模式.基于此的内容:我有一个旋转编码器旋钮,在每个状态下的作用都不同. 我一直在努力将自己的头缠住,无法在我的尽头做任何事情.我不确定如何将中断处理程序注入每个状态以及如何调用中断处理程序的切换.没有状态模式,代码看起来像: RotaryEncoder RE = new RotaryEncoder(pin1, pin2);//create new instance of knob RE.OnRotationEvent += OnRotationEventHandler;//subscribe to an event handler. //do other things ... ... static void OnRotationEventHandler(uint data1, uint data2, DateTime time) { //do something } 那么,适当的代码
12 2024-04-26
编程技术问答社区
在WinForms中如何处理不可见控件的绘画?
我正在尝试覆盖 Onpaint Windows形式的事件 .net紧凑型框架. 到目前为止,我能够使用梯度,圆形矩形等绘制控件,通常在常规控件中可能无法使用. 但是,当我想制作控制不可见时,我会遇到问题.现在,我要做的是重新绘制除那些看不见的控件.由于需要一些时间,因此会引起一些闪烁. 有人知道Windows如何处理绘画"无形"控件?或者您可以提出有关如何实现此目的的任何算法或方法. 解决方案 您应该做几件事. 不要在OnPaint中绘制给您的图形对象.将其绘制到后缓冲区,然后将其绘制到末端的图形上. 覆盖OnPaintBackground,没有做任何事情. 仅在可能的情况下,只能使整个屏幕的区域无效 如果您将单个控件更改为"不可见",则将其更改并仅使其界限无效.在OnPaint中,您要进行图纸,根据可见性属性省略"隐形"控件.只有剪辑区域才会更新.您甚至可以通过检查OnPaint上的传入剪辑区域,而只是费心绘制该区域的逻辑抽奖.但是,这有点复杂
14 2024-04-23
编程技术问答社区
在.NETMF 4.0中解析RFC822-日期时间
我有一个用.netmf编写的应用程序,要求我能够解析RFC822-DATETIME. 通常,这很容易,但是netmf没有datetime.parse()方法,也没有某种模式匹配的实现,所以我几乎卡住了. 有什么想法? 编辑:可能需要"智能"解决方案.这很难的部分原因是,所讨论的日期有额外的空间趋势(但有时甚至有时).一个简单的子字符串解决方案可能有一天可以工作,但是当DateTime之间在零件之间有一个额外的空间时,下一步可能会失败.我无法控制日期时间,它来自NOAA. 解决方案 良好的OL'String操纵: Sun, 06 Jun 2010 20:07:44 +0000 1 2 3 0123456789012345678901234567890 string x = Sanitize(" Sun, 06 \t Jun 2010 \r\n 20:07:44 +0000 "); int day
14 2024-04-20
编程技术问答社区
导致极端不稳定的PID控制器积分项
我有一个在机器人上运行的PID控制器,该机器人旨在使机器人转向指南针. PID校正以20Hz的速度重新计算/应用. 尽管PID控制器在PD模式下运行良好(即,具有不可或缺的术语为零),即使是最小的积分量也会迫使输出不稳定,以使转向执行器被推到左或左或右极端. 代码: private static void DoPID(object o) { // Bring the LED up to signify frame start BoardLED.Write(true); // Get IMU heading float currentHeading = (float)RazorIMU.Yaw; // We just got the IMU heading, so we need to calculate the time from the last correcti
12 2024-04-18
编程技术问答社区
用于嵌入式系统的C#?
" C#适合为托管系统和嵌入式系统编写应用程序,从使用复杂的操作系统的非常大的范围到具有专用功能的非常小的功能." - 设计目标(wikipedia) 尽管这在很大程度上取决于嵌入方式的" emeedded", 您认为C#已经达到了这个目标? 您是否认为C#比C/C ++更好,即使不是更好的工具? 解决方案 好吧,有 Micro Framework ;我没有听到很多声音,但我不喜欢"嵌入".但这取决于它在做什么... c#是一种很好的通用语言,但是有时需要硬核(并挂起代码复杂性). ). 其他解决方案 在C#和Wince平台上编写了很多商业上成功的软件应用程序.例如,某些设定框(来自AT&T等)在.NET CF上运行C#代码.考虑到这些盒子有64或128 MB RAM,我认为嵌入式中的C#嵌入了足够的嵌入. 点是在硬件加速器和其他编译器的进步之类的进步中 最大的优势是,在最新的Visual Studio中,您可以 debug 从VS进行设备.至
10 2024-04-14
编程技术问答社区
在.NET Micro Framework中,将'float'转换为'byte[4]'再转换回'float'。
将float转换为byte[4]然后返回" float"的最佳方法是什么? 我在c# 解决方案 我已经从 NetDuino修改了BitConverter类实施允许endianness规范(这不是"最佳方式",但它起作用).如果字节数组通过网络发送,我将使用BigEndian.提醒您unsafe在NetMF中不正式支持 . using System; using System.Diagnostics; namespace netduino { public static class BitConverter { public static byte[] GetBytes(uint value) { return new byte[4] { (byte)(value & 0xFF), (byte)((value >> 8)
6 2024-04-12
编程技术问答社区
这个表达式在C语言预处理程序中是否正确
我想在A c 中执行以下算术函数,包括我发送变量x. 时的语句. #define calc_addr_data_reg (x) ( base_offset + ((x/7) * 0x20) + data_reg_offset) 我将如何使用bitshifts实施分区和乘法操作?在部门操作中,我只需要商. 解决方案 回答问题, "此表达式在C预处理器中是否正确?" 我看不到任何问题. 我将如何使用bitshifts实施分区和乘法操作?在部门操作中,我只需要商. 编译器将比几乎所有情况下都能做得更好,以优化您的代码.如果您必须询问Stackoverflow如何执行此操作,那么您不知道足够的表现以胜过GCC.我知道我当然不是.但是因为您问以下是海湾合作委员会如何优化它. @edheal, 这需要更多的空间才能正确响应.在您给出的示例(Geters和Setters)中,您绝对正确,但是在此特定示例中,inline inline假设该功能被称
10 2024-04-10
编程技术问答社区
在微控制器编程的ISR功能中使用volatile关键字
作为ISR函数中使用的一般概念全局变量("值"),应声明为挥发性,以避免编译器优化.但是,我的疑问是在ISR中调用的子功能" ISR-SUB"中使用的全局变量,是否还需要将ISR中调用的全局变量使用为挥发性? unsigned int STATUS; // -----> needs to be declared as volatile ? void ISR-SUB() { STATUS = 1; -->accessed in sub function invoked in ISR which will be optimized or not } void ISR () { ISR-SUB(); } void main() { /* interrupt occurred and ISR called */ if (1 == STATUS) { code part } } 解决方案 当然你会. volatile不是ISR的特权,它在
10 2024-04-10
编程技术问答社区
编写一个C语言程序来调用另一个程序,而不使用任何内置库
我试图为引导加载程序编写一个简单的" go-command",该启动加载程序将我带到RAM Say 0x18000000中的特定地址,并且应该执行闪烁LED的程序.我有两个.c文件说LED.C和GO.C,其中LED.C闪烁两个LED.但是我想知道并且不知道该如何将控件/调用其主()转到此go.c文件以转到该地址并开始闪烁的LED?但是应该在不包括其他标头文件,库等的情况下完成.请帮助我!提前致谢.以下代码适用于LED.C void delay () { volatile int i; for(i=0;i
12 2024-04-10
编程技术问答社区
如何解决Misra C:2012年规则11.6?
我利用Microchip示例NVMEM.C文件功能将数据写入PIC32微控制器的特定内存地址.当我尝试使用它显示以下misra错误时:我刚刚发布了错误的示例代码.我的整个代码编译并正常工作. 1]在nvmemwriteword(((void )app_flash_mark_address,(uint)_usermark); 如何解决此错误? nvmem.c uint8_t NVMemWriteWord(void* address, uint32_t data) { uint8_t res; NVMADDR = KVA_TO_PA((uint32_t)address); //destination address to write NVMDATA = data; res = NVMemOperation(NVMOP_WORD_PGM); } test.c #define ADDRESS 0x9D007FF0U; NVMemWriteWor
28 2024-04-10
编程技术问答社区
与多任务下的UART FIFO有关的错误
附加程序: 这些代码是根据ti uart.c驱动程序库编写的. while(1){ //check if message on Queue -> read or check UART input if(uxQueueMessagesWaiting( UART_TASKQ ) != 0){ //may have bugs // deQueue xQueueReceive( UART_TASKQ, &UARTTaskHandle, 0x0A ); //do the task's mission using the data in the stucture(put by control task) //Print out the input data. //**********debugging data /* testPo
14 2024-04-10
编程技术问答社区
为 "C "项目创建一个构建环境,在编译时动态选择文件夹
可以说我的文件夹结构就是这样.. + - 应用程序 | + - micro_controller_1 | + - micro_controller_2 | + - micro_controller_3 我有一个编译开关(select_micro)设置为#define select_micro == micro_controller_1,那么我的项目应该在micro_controller_1中使用驱动程序构建应用程序,同样,如果#define select_micro = = micro_controller_2,那么应用程序应该与驱动程序构建应用程序有关驱动程序文件的应用程序在micro_controller_2 中 请让我知道是否有上述模板. 解决方案 您可以导出要构建并提供可执行文件路径的文件夹的特定路径.您可以获取更多信息.在此线程中. 我如何将DIR添加到Makefile中的$ path? 或简单地维护不同的makefiles制作不
10 2024-04-10
编程技术问答社区
在STM32H7上使用执行跟踪片上缓冲器(ETB)
在某些特定情况下,我需要输出片上缓冲区(ETB)执行跟踪.我说的是操作功能,而不是在调试阶段的ETM跟踪. 我已经阅读了ARM®CORESIGHT™ETM-M7技术参考手册,但使用此ETB功能几乎没有细节. 还有如何使用ETB? 编辑:由于Stmicro的演讲,我澄清了情况.它指出" 可以将ETF用作固定痕迹的痕量缓冲区.可以通过软件或调试器读取跟踪, 或通过微量端口冲洗.如果配置为圆形缓冲区, 痕迹将连续存储,因此最近的迹线 将覆盖最古老的.或者,FIFO全旗可以 当缓冲区已满时,可用于停止迹线,因此 在特定时间点捕获痕迹. 是的目标设备一直连接到外部调试捕获设备. ETM跟踪可能是完全不受欢迎的(除了具有逻辑活动的额外功耗成本外). 该体系结构非常通用,尽管每个实现都会在实施的方面做出不同的权衡.不幸的是,这意味着文档已经扩散了.您可能会发现此对于上下文(但不是细节). 要实现崩溃分析,您需要介绍以下步骤: 在圆形缓冲区模式下配置ETF 配置
6 2024-04-10
编程技术问答社区
如何在应用程序(stm32f4 HAL)中改变SCB->VTOR?
i为STM32F4构建引导加载程序,并使用更改使用System_stm32f4xx.c File中的SCB-> VTOR的VECT_TAB_OFFSET值来构建用户应用程序,但如果我在应用程序中进行操作.它无法正常工作. 我在main()开头的scb--> vtor = 0x8040000 = 0x8040000. " nofollow noreferrer"> bootloader 解决方案 main()之前的STM32启动代码调用SystemInit(). SystemInit()设置SCB->VTOR值(除其他事项外). SystemInit()在提供的文件system_stm32f4xx.c中实现.您可以通过编辑VECT_TAB_OFFSET的值来自定义分配给SCB-VTOR的值,该值也在system_stm32f4xx.c中定义. (您的项目文件夹中应该有system_stm32f4xx.c的副本,您可以为项目自定义.) 如果您需要启动和应用程序的不同值VECT_
18 2024-04-10
编程技术问答社区
我如何表示一个指向地址空间开始的指针?
让我们考虑一些奇怪的假设嵌入式系统,我需要制作和使用指向我地址空间的第一个字节的指针.也就是说,一个等于零的指针.不是零指针,而是一个完全有效的零指针,就像其他任何指针一样,它可能会被删除,增加或视为数组.我将如何用将零指针视为特殊但没有真正的空类型的语言? 解决方案 在某些罕见的旧机器上,整个"具有特殊值不同的零指针具有不同的特殊值",但实际上,您的null/0指向Adress 0的Null/0指向0要在大多数机器上解决0. 它将完全可以解释,如果有一些内存映射到该区域,您可以在该地址上写入. 我曾经在与之合作的嵌入式平台上有一个.因此,我曾经在地址0上放置一个调试器观察点,因为所有进入该区域的访问都是无效的效果.以这种方式捕获了一些错误^^ 其他解决方案 在大多数架构中,完全没有什么特别的零指针,它只是一个常规指针,地址为0.如果您使用的是在那里具有实际内存的嵌入式系统,则应正常工作.如果您尝试检查指针是否有空值,则唯一的问题是. 其他解决方案 如
14 2024-04-10
编程技术问答社区
将浮点数和整数转换为char*。
我是C的新手,并且是与C一起插入了这个嵌入式处理的世界位接口.我一直在阅读一些帖子,我看到了将int和float转换为char*的所有这些好主意,但是我不确定它们中发生了什么. 有人可以为我的两个查询提供一种方法和一些解释吗? 解决方案 实际上取决于标准库,以及在某些库的嵌入式系统中,这些系统已部分实现,甚至没有.完全标准C99 实现您可能会做 之类的事情 char buf[40]; int i; double x; // compute i & x, then make a string from them with:: snprintf(buf, sizeof(buf), "i=%2d x=%.2f", i, x); 然后,您可以将该buf发送到您的LCD端口,或者strdup以供以后使用. (如果使用strdup,则需要free结果). 阅读其他解决方案 由于您正在进行嵌入式编程,因此您可以意识到标准转换通常会使用对任何处理器征税的部门. 由于使
12 2024-04-10
编程技术问答社区
如何在Greenhills编译器的内联汇编中使用全局变量?
我想在内联汇编中使用全局变量. asm(" ldr r0,g_tsinitstackpointraddress"); 此处g_tsinitstackpointeraddress是一个全局变量.同时编译其没有显示任何错误. ,但是在链接时显示以下错误 [elxr](错误)超出范围:0x1001326(unsigned)不适合12 在地址执行搬迁类型R_ARM_POOL(4)时的位时 0x10013E0从Initstack+0x20(drv.o(.text)+0x1a4), g_tsinitstackpointeraddress+0x0(((commun)+0xb6) 这里我的功能名称是initstack,文件名是drv.我无法理解错误. 使用的处理器:Cortex R4 编译器:Greenhills 解决方案 获得了解决方案 __ asm(" g_tsinitstackpointeraddress_a:dcd g_tsinitstackp
14 2024-04-10
编程技术问答社区
在最后加载的精灵部分之后,闪存中存在的额外数据
我有一个涉及引导加载程序的STM32项目. Bootloader CRCS闪光灯的整个应用程序区域,然后将此值与flash的应用图像区域之后存储的固件标头进行比较. 我写了一个python脚本,该脚本是在二进制构建之后运行的.该脚本将构建产生的小精灵文件接收到"虚拟闪存"图像中,该图像通常代表MCU正常加载后MCU上存在的内容.阵列开始是应用区域的大小,每个字节的初始值为0xff,就像闪光灯在完整擦除之后一样.然后,该脚本从Elf中获取每个部分,并覆盖该部分应位于该部分的虚拟闪光图像的部分. 最后,脚本CRCS应用程序区域并将结果值注入原始精灵. 这一切都很好,但是我在MCU的实际闪存内容中看到了其他数据,这些数据无法确定其来源.在编程精灵之前,将闪光灯完全删除,因此该数据来自加载到设备上的小精灵. 我猜想这里发生的是精灵中有一些部分,我的脚本忽略了,但是当使用常规手段闪烁时,这些部分仍将其写入Flash. 以下是我的应用程序图像上阅读的结果: 部分标
18 2024-04-10
编程技术问答社区
如何将有数组的宏字符串化为#define a_macro {5,7,7,97}?
请通过. #define _VERSION_ 1.4 #define DEFAULT_NETWORK_TOKEN_KEY { 3, 6, 5, 100} //我不能更改上述宏,但下面 #define STR_VALUE(arg) #arg #define FUNCTION_NAME(name) STR_VALUE(name\r) #define TEST_FUNC #AP started v _VERSION_ #define TEST_FUNC_NAME FUNCTION_NAME(TEST_FUNC) #define QUOTE_X(t)#t #define QUOTE(t)QUOTE_X(t) #define ABC 100 //{ 3, 6, 5, 100} #define MYSTR "The value of ABC is" const uint8 startMsg[] = MYSTR " " QUOTE(ABC); 结
10 2024-04-10
编程技术问答社区
从Trace32脚本语言中访问观看变量
我想创建一个诊断脚本,并希望以某种方式将用户输入在手表窗口中输入到脚本的所有变量.我如何访问手表变量并操纵它们? 我尝试了一个对话框.查看,但这浪费了太多时间.可能还有另一个跟踪命令,但我不知道.谢谢! 解决方案 在Trace32中不直接支持从脚本中获取开放var的内容. 但是,您可以在脚本中执行以下操作 重定向打印到文件PRinTer.FILE "~~~/winpage.txt" ASCIIE(当然,您可以选择任何其他文件名而不是winpage.txt) 窗口WinPAGE.List向您显示所有打开的子窗口.使用WinPrint.WinPAGE.List,您可以将所有打开窗口的列表发送到之前指定的文件(winpage.txt). 现在,将Winpage.txt的内容解析为Windows的名称,即Windows Windows. 窗口名称默认情况下,使用资本'W'开始,然后是三个十进制数字(但也可以完全不同),然后遵循命令(圆括号),该命令用于打开视窗.
20 2024-04-10
编程技术问答社区