问题标签 [ucos]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
arm - LDMFD 奇怪地影响 R13
我们将 arm9 与 ucos 一起使用。通用移植功能的OS_CPU_ARM_ExceptHndlr_BrkTask
最后一个工具在我们的系统中有奇怪的行为。
假设 SP 为 0x10002000,后面的 15 个 DWORD(将被复制到 R0-R12、LR、PC)的值从 1 到 15。我们发现 PC(R15)发生了变化并跳转到 15,但 SP (R13) 被更改为一个奇怪的值(远离堆栈内存空间的地址)。我预计它会变成 0x1000203C (0x10002000+4*15)。
为什么R13会这样改?
rtos - 比较 RTOS 的参数是什么?
我想比较两个 RTOS(例如 -> Keil-RTX、Ucos-iii 和 freertos),但我不知道我需要比较它们的哪些参数,例如内存占用、认证等。
我们在哪些方面比较 RTOS?
memory-management - uCOS-III下的内存分配
我正在开发一个在 uCOS-III 下使用的 C 库。CPU 是 ARM Cortex M4 SAM4C。在库中,我想使用第三方产品 X,其特定名称与此处无关。X 的源代码是完全可用的并且可以毫无问题地编译。
在 X 内部,使用 calloc() 和 free() 执行了大量内存分配。问题是,由于内存碎片,不建议嵌入式系统直接使用 malloc。uCOS-III 的文档明确建议不要使用 malloc - 而是应使用 OSMemCreate/OSMemGet/OSMemPut 从静态分配的内存块中分配和释放内存块。
问题一:
绕过malloc的“标准实现”的一般建议是什么?我更喜欢一种 malloc,我可以在其中访问固定的内存池(例如,专用于特殊任务)
问题2:
应该如何正确使用 OSMemCreate()?我首先要初始化一个具有一定块大小的内存分区。请求的内存量在 4 字节和大约 800 字节之间。我可以根据要求获得块,但大小固定。如果 block-size=4 我不能分配 16 字节,因为块在内存中不连续。如果 block-size=800 并且我只需要 4 个字节,那么大部分块都没有使用,我很快就会用完块。
所以我不知道,如何通过使用 OSMemCreate 来解决我原来的问题......
任何人都可以给我一个建议,我该如何继续?
非常感谢,迈克尔
embedded - 调用 OS_EXIT_CRITICAL() 时,STM32 运行到 HardFault
这很奇怪。
在OSTimeDly(10)中,有OS_Enter_CRITICAL()和OS_Exit_Critical(),当代码运行到OS_Exit_Critical()时,会发生HardFault。
但是,如果我将代码更改为:
还有OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(),但是当代码运行到OS_EXIT_CRITICAL()时,没有发生HardFault。为什么?我不认为有什么不同。
c - 是否可以从 MPC5674F(NXP PPC)上的另一个图像调用函数?
我的问题在下面解释。
- 构建主映像。
- 使用 JTAG 下载主映像。
- 构建应用程序映像。
- 使用 RS232 下载应用程序映像。
- 运行主映像。
- 从 main() 调用应用程序映像中的 func_a。
在这个系统上可以吗?如果可能的话,请让我知道该怎么做。
谢谢, 问候, 亨克
cortex-m3 - 在cortex-m3平台上,UCOS-III为什么不使用SVC来执行pendsv?
最近在看UCOS-III的源码,有一个关于UCOS-III在Cortex-M3平台上运行时的任务切换问题。它使用 PendSV 进行任务切换,直接写寄存器 SCB_ICSR(中断控制和状态寄存器),但访问寄存器 SCB_ICSR 需要特权操作级别。这意味着处理器在特权操作级别以进程模式运行,没有异常和中断,我认为这并不安全。为什么 UCOS-III 不使用 SVC 来执行 pendsv?是效率问题吗?有人可以为我解释一下吗?谢谢。
背景:软件:UCOS-III
硬件:Cortex-M3(STM32F103)
代码:
我觉得这个方法比较好: Cortex-M3 task switch using SVC and Pensv
- 任务 A 调用 SVC 进行任务切换(例如,等待某些工作完成)。
- 操作系统接收请求,准备上下文切换,并挂起 PendSV 异常。
- 当 CPU 退出 SVC 时,它立即进入 PendSV 并进行上下文切换。
- 当 PendSV 完成并返回线程级别时,它执行任务 B。
- 发生中断并进入中断处理程序。
- 在运行中断处理程序例程时,会发生 SYSTICK 异常(针对 OS 滴答)。
- 操作系统执行基本操作,然后挂起 PendSV 异常并为上下文切换做好准备。
- 当 SYSTICK 异常退出时,它返回到中断服务程序。
- 当中断服务程序完成时,PendSV 启动并执行实际的上下文切换操作。
- 当 PendSV 完成后,程序返回到 Thread 级别;这次它返回到任务 A 并继续处理。
c - 在 UC/OS-II 中打印 OSTime
设备:F28335 contorolCRAD 和实验者套件 - Delfino F28335。
移植 ucos-II。
我使用 OSTimeGet() 函数来获取 OSTime。
但是 task1 每次都返回 '0' 并且 task2 不起作用。
问题是什么?如何解决这个问题?
c - 浮点值在 uC-OS-III 中不起作用
定义的浮点变量float
似乎在 µC-OS-III 中不起作用。像这样的简单代码:
会产生这样的输出:
FLOAT:2681561605....
当我在 µC-OS-III 初始化之前在 main() 中测试这段代码时,它工作得很好。但是,在多任务处理开始后,它就不起作用了。它在任务或启动任务中不起作用。
我已经在互联网上搜索了类似的问题,但我找不到任何东西。但是,有这篇文章说“用于 ARM 的 IAR C/C++ 编译器要求堆栈指针以 8 字节对齐......”
https://www.iar.com/support/tech-notes/general/problems-with-printf-floating-point-f-on-arm/
我将堆栈定位在 8 字节对齐的位置。然后代码在任务中工作,但操作系统在 printf 之后立即崩溃。
我的编译器工具链是 IAR EWARM 版本 8.32.1,我正在使用带有 STM32F103 的 µC-OS-III V3.07.03。
我可能会错过一些操作系统或编译器配置。我不知道!几年前我在使用 µC-OS-II 时遇到了同样的问题,但最后我决定使用定点数学而不是浮点数。
有人可以解释一下吗...
c++ - 嵌入式设备 -> std::thread -> FreeRTOS?
所以目前我正在研究将纯C++17项目用于嵌入式设备(Cortex m4)的可能性。但基于它是嵌入式设备的事实,我们有端口并使用RTOS ,例如 FreeRTOS 或 uc-OS,我非常喜欢使用它(因此,如果需要,std::thread
我们可以轻松更换RTOS )。有没有办法覆盖C++中的线程类以使用平台依赖的RTOS?
提前致谢
embedded - 如何在 uCOS II 和 TM4C123G (ARM M4) MCU 中实现硬件中断?
背景:
我正在使用uCOS II、Keil uVision 5和带有TM4C123GH6PM MCU 的 TIVA 板。我得到了一个 uCOS II 的端口以及一个空白项目文件来开始。我编写了所需的任务并且程序正常工作,但现在我对实现中断感兴趣并试图了解它们如何与 RTOS 共存。这一切都在 C中完成。
问题:
中断不起作用;他们根本不火。在某些情况下,其他任务也不会执行。核心问题是我真的不明白中断如何与 RTOS 共存。我已经在baremetal上编写了代码(在汇编和C中),其中中断可以完美地工作,并且我完全理解当代码和cpu之间没有层时它们是如何工作的。
我试过的:
- 我阅读了 uCOS-II 附带的书籍和参考手册,并寻找了实现中断的方法。什么都不提;关于中断唯一提到的是它们如何与调度程序交互,因此中断仅涵盖在理论领域。
- 我在micrium(原始供应商)论坛上问过,没有回复/似乎是一个死论坛
我查看了 uCOS 端口中包含的库,发现了一些有用的东西:
- bsp_int 是处理中断的库。BSP 代表 Board Support Package,旨在促进软件和代码之间的交互
- 该库具有注册中断并启用它的功能。rtos 使用自己的 ISR 处理程序表,映射到 cpu 的 NVIC。所有处理程序都通过通用处理程序过滤。该库中的两个有用函数是:
- bsp_intVectSet 获取中断触发 ID(即 bsp_int_id_gpiof)和指向中断处理程序的指针并注册它
- bsp_intEn 获取中断 ID 并启用它
- bsp_int 库包含在 bsp.c 中,它为中断调用初始化函数(来自 bsp_int)(bsp_IntInit())
- bsp.h 文件包含在主应用程序文件 (app.c) 中
- app.c main 是程序的入口点。主程序禁用中断,初始化 uCOS(即内核)创建第一个/启动任务称为 AppTaskStart,并启动多任务处理(即,将控制权交给 rtos 并且函数永远不会返回)。我假设内核重新启用中断,因为它需要那些运行
- 所以 rtos 的工作方式(据我了解)是它劫持了 systick 计时器,因此在每个时钟滴答声中,内核都会被调用并能够安排任务。
- AppTaskStart 是内核域中执行的第一个任务,它调用 bsp_init(其中调用 bsp_IntInit 来初始化中断表等)并执行其他初始化任务
- 我之前在没有内核的情况下设置中断的方式是使用 TI 提供的 Tivaware 库(C 语言)。它具有创建中断、指定触发(即上升/下降沿、定时器溢出等)和启用它们的功能。这种方法有效,我认为我应该用它来设置我想要的中断
- 因此,我使用 tivaware 库在上升沿的一个 gpio 端口(机械开关连接到该端口)上设置中断。此代码以及启动端口 f 外围设备、将开关引脚设置为输入和启用上拉的其他代码都包含在 bsp_init (bsp.c) 中,该程序从 main 调用的 AppTaskStart 调用。到目前为止,一切正常,rtos 已启动,其所有任务都相应地执行。当我尝试将代码直接移动到主程序并将程序闪存到板上时,rtos 初始化(LED 闪烁)但随后任务不执行。任何想法为什么会这样?
- 如果我使用 tivaware 库中的代码添加代码以启用和注册在同一函数中关闭开关时的中断,则 rtos 不会初始化。
- 我是否需要使用 tivaware 库设置/注册/启用中断以及使用板支持包 (bsp) 库注册和启用它们?到目前为止,我理解这一点的方式是 bsp 仅为内核注册/启用中断,而 tivaware 代码通过直接写入寄存器来启用它们,因此需要后者来设置中断的 cpu 部分,而前者是需要设置中断的操作系统部分。但我不知道。我真的不明白他们是如何在 uCOS II 下设计合并中断的。它们确实指定了应该如何编写中断处理程序以及要使用哪些宏,但仅此而已。
接下来我应该尝试什么?有人有使用这两个组件(rtos 和板)的经验吗?
我只是停留在这一点上,我一直在玩代码,移动东西,试图找到解决这个问题的线索/线索。我什至无法调试 rtos,因为 uVision 不支持 uCOS,而且我不能使用步进调试,因为每个时钟滴答都会触发中断,并且 PC 不断变化,因此 IDE 无法跟踪它。
我知道 IAR Embedded Workbench 支持 uCOS-II,我的笔记本电脑上有应用程序,我尝试设置一个项目,但我只获得了 Keil 的端口/启动项目,我不知道如何设置一个IAR 电子战。Micrium 网站上唯一的端口是用于 TM4C129 系列的,我尝试使用它来启动 IAR EW 项目,但我无法让它工作(库未链接/缺少文件)。