问题标签 [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.

0 投票
1 回答
108 浏览

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会这样改?

0 投票
1 回答
241 浏览

rtos - 比较 RTOS 的参数是什么?

我想比较两个 RTOS(例如 -> Keil-RTX、Ucos-iii 和 freertos),但我不知道我需要比较它们的哪些参数,例如内存占用、认证等。

我们在哪些方面比较 RTOS?

0 投票
1 回答
545 浏览

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 来解决我原来的问题......

任何人都可以给我一个建议,我该如何继续?

非常感谢,迈克尔

0 投票
1 回答
282 浏览

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。为什么?我不认为有什么不同。

0 投票
0 回答
98 浏览

c - 是否可以从 MPC5674F(NXP PPC)上的另一个图像调用函数?

我的问题在下面解释。

在此处输入图像描述

  1. 构建主映像。
  2. 使用 JTAG 下载主映像。
  3. 构建应用程序映像。
  4. 使用 RS232 下载应用程序映像。
  5. 运行主映像。
  6. 从 main() 调用应用程序映像中的 func_a。

在这个系统上可以吗?如果可能的话,请让我知道该怎么做。

谢谢, 问候, 亨克

0 投票
2 回答
445 浏览

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

  1. 任务 A 调用 SVC 进行任务切换(例如,等待某些工作完成)。
  2. 操作系统接收请求,准备上下文切换,并挂起 PendSV 异常。
  3. 当 CPU 退出 SVC 时,它立即进入 PendSV 并进行上下文切换。
  4. 当 PendSV 完成并返回线程级别时,它执行任务 B。
  5. 发生中断并进入中断处理程序。
  6. 在运行中断处理程序例程时,会发生 SYSTICK 异常(针对 OS 滴答)。
  7. 操作系统执行基本操作,然后挂起 PendSV 异常并为上下文切换做好准备。
  8. 当 SYSTICK 异常退出时,它返回到中断服务程序。
  9. 当中断服务程序完成时,PendSV 启动并执行实际的上下文切换操作。
  10. 当 PendSV 完成后,程序返回到 Thread 级别;这次它返回到任务 A 并继续处理。
0 投票
1 回答
481 浏览

c - 在 UC/OS-II 中打印 OSTime

设备:F28335 contorolCRAD 和实验者套件 - Delfino F28335。

移植 ucos-II。

我使用 OSTimeGet() 函数来获取 OSTime。

但是 task1 每次都返回 '0' 并且 task2 不起作用。

问题是什么?如何解决这个问题?

0 投票
1 回答
121 浏览

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 时遇到了同样的问题,但最后我决定使用定点数学而不是浮点数。

有人可以解释一下吗...

0 投票
2 回答
1477 浏览

c++ - 嵌入式设备 -> std::thread -> FreeRTOS?

所以目前我正在研究将纯C++17项目用于嵌入式设备(Cortex m4)的可能性。但基于它是嵌入式设备的事实,我们有端口并使用RTOS ,例如 FreeRTOS 或 uc-OS,我非常喜欢使用它(因此,如果需要,std::thread我们可以轻松更换RTOS )。有没有办法覆盖C++中的线程类以使用平台依赖的RTOS

提前致谢

0 投票
1 回答
472 浏览

embedded - 如何在 uCOS II 和 TM4C123G (ARM M4) MCU 中实现硬件中断?

背景:

我正在使用uCOS IIKeil 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 项目,但我无法让它工作(库未链接/缺少文件)。

谢谢你!