问题标签 [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 回答
82 浏览

c - 如何改进 Nios 2 的特设巡航控制系统?

我在 Nios 2 中为学校作业编写了一个临时巡航控制系统。我用 github 对其进行了版本控制。我们希望巡航控制在速度 >= 25 m/s 时最多相差 2 m/s。我能做的最新改进是检查确实改善了控制的条件下的速度。在我尝试改变之前我无法证明改变会产生效果,所以这是一种临时的试错方法,不太好。现在,如果激活,巡航控制实际上会将速度保持在 2 m/s 以内。既然我设法改进了一次,还能做些什么呢?我可以使用控制理论中的东西来改进行为吗?

0 投票
3 回答
934 浏览

synchronization - uCOS-ii 互斥体 vs 临界区 vs 调度程序锁定 vs 信号量

我正在为运行 uCOS-ii 的嵌入式系统写作。我需要以原子方式写入(和读取)两个整数(值和时间戳,它们应该彼此同步)。最简单的方法是用临界区包装这两个值的写入,从而禁用任何中断或任务切换。但有人告诉我这是非常激进的,而且很容易通过禁用中断来搞乱其他实时的东西。

但是写两个整数是一个很小的操作,我不确定使用互斥锁的整个簿记是否值得。

所以我做了一些测量。我测量了将这两个值写入一百万次所需的时间,并计算了所需的毫秒数。所有这些都是在一个任务中完成的,只是为了了解不同同步机制的开销。结果如下:

  • 无同步机制:~65
  • 临界区:~185
  • 优先级为 2 的互斥体:~1890
  • 调度程序锁定:~1750
  • 用 1 初始化的信号量:~1165

我承认我用附加的调试器测量了这个,因为我是新手,我不确定我们是否有分析器,但对我来说 CS 最快并且互斥体比信号量慢是有道理的(因为它具有所有优先级反转处理)。

那么我应该由此得出结论,使用临界区是最好的吗?还是禁用中断真的是一件非常糟糕的事情?一般来说 - 是否有关于何时使用每种同步机制的指南?

更新:一位同事建议使用自旋锁。显然,这将比更高级的同步机制具有更小的开销。但我想知道在这种特定情况下它是否比关键部分更好。

更新 2:想一想,因为我们只有一个 CPU,所以自旋锁不会有任何好处。它只会旋转直到上下文切换......

0 投票
2 回答
3849 浏览

c - 对使用 RTOS 的项目进行单元测试

对于我的下一个嵌入式系统项目,我想采用单元测试。从技术上讲,它可能不是测试驱动的开发,但我至少想预先进行单元测试并进行全面的单元测试。

我正在使用 IAR EWARM 工具链。我正在考虑使用 cmocka、unity 或 cunit。我正在学习使用 µC/OS-III 作为 RTOS。

问题来了:单元测试如何与图中的 RTOS 一起工作?EG:我应该禁用内核并将代码作为单线程应用程序进行单元测试并存根所有/大多数内核调用,还是有更好的方法?

示例: 在 µC/OS-III 中,入口点仍然是 main。从 main 调用任何初始化代码,然后调用 OSStart() 开始多任务处理。因此,当我运行测试工具时,我无法调用 OSStart()

然后在任务中的所有应用程序代码中,我只需要模拟消息传递和延迟对内核的调用。

这是最好的方法吗?或者我是否更适合启动内核,为我的测试运行程序创建一个任务,并将所有任务作为一个线程运行,或者是否有其他一些好的方法涉及从测试工具中产生其他任务。

0 投票
0 回答
727 浏览

sqlite - SQLite 移植到 STM32 时出现内存分配问题

我正在尝试将 SQLite 移植到在 STM324xG_EVAL 板上运行的 uCOS RTOS。我正在使用 micrium 文件系统来制作 SQLite 使用的基于 RAM 的文件系统。我尝试了不同的构建配置并使用 sqlite3_config API 来定义不同的内存区域,如堆、暂存和页面内存。我能够初始化(sqlite3_initialize)和打开(sqlite3_open)数据库。但是当我尝试创建表(sqlite3_exec)时,我收到了“找不到日志文件”、“内存不足”之类的错误。可能是什么问题

谢谢,四条托马斯

0 投票
3 回答
5152 浏览

c - 在 C 中只执行一次代码

我只想执行一次代码。我使用了基于 bool 类型的全局变量的解决方案。我的问题,这是最好的解决方案吗?

备注:我用的是ucos-II。

0 投票
1 回答
816 浏览

semaphore - ISR 中的 UC/OS III 信号量有时不起作用

我的信号量有问题,有时在 ISR 中调用的 SemPost 似乎无效。

我的应用程序基于 Micrimum UCOS III,目标平台基于 Microsemi Smartfusion2 SoC (Cortex-M3)。我的应用程序包含两个任务(A 和 B),但是当问题发生时只有一个处于活动状态(另一个被卡在信号量上)。

当活动任务(我们称之为任务 A)执行以下操作时会出现问题:

  1. 写入某个寄存器以在触发中断后开始操作
  2. 等待操作完成在 semafore 上创建 OSSemPend(我们称之为 Sem A),将超时设置为 100 毫秒。
  3. 检查 OSSemPend 调用是否正常结束或是否发生超时

当中断被触发时,相关的 ISR 在 Sem A 上进行 SemPost,以便在超时之前解锁信号量。

当问题发生时,OSSemPend 返回 OS_ERR_TIMEOUT。我很少看到这个问题。

我确定:

  • 给出启动操作(见第 1 点)并开始操作。
  • 触发中断并执行 Sem A 上的 OSSemPost。
  • 从开始到 500 微秒(即 < 1 毫秒)后触发中断

代码是否正确编写?在 ISR 中使用信号量是否有任何限制?有人能帮我吗?谢谢

我附上了代码的简化版本

0 投票
2 回答
250 浏览

c - uC/OS-III Systick & Peripheral timer0 用于 PWM 干扰

我无法在运行 uC/OS-III 的 NXP LPC1857 上获得 LED 的 PWM 信号平稳运行。只有当我禁用以 1ms 运行的操作系统系统时,经常发生的闪烁才会停止。

我已经用 4 个匹配寄存器设置了我的计时器,一个用于每种颜色(红色、绿色、蓝色),一个用于整个周期。前三个匹配输出正在清除每种颜色的物理输出引脚。最后一个周期匹配产生一个中断来设置下一个周期的所有三种颜色输出。

我试图通过在中断周围添加以下代码来在 timer0 中断期间禁用来自操作系统的中断:

有谁知道为什么 systick 会导致 PWM 信号闪烁?

0 投票
0 回答
162 浏览

operating-system - uCOS-III下的信号量

我在Arm Cortex M4下使用uCOS-III,遇到以下问题:

如果 OSSemPend() 在同一个任务中执行了两次),比如

(不发出 OSSemPost())它不会在第二次调用时遇到超时,而是无限阻塞。

我检查了我能做的,但仍然找不到问题......有人可以解释一下这里发生了什么吗?

非常感谢,

迈克尔

0 投票
1 回答
745 浏览

c++ - 带有 C++ 的 MicroC OS-II

我想使用 MicroC OS-II 建立一个新的嵌入式项目并使用 C++。

当我想使用 new 运算符创建一个类的实例时,我的处理器遇到了一个异常,该异常似乎来自于 new 运算符中的 malloc 调用失败。这是一个失败的例子:

testC 是具有整数成员变量的类。顺便说一句,我正在使用 Altera Nios 2。

经过一番研究,我得出的结论是 malloc 与 RTOS 不兼容。因此我的问题是:是否可以将 C++ 与 uC/OS-II 一起使用?或者有没有办法替换新运营商中的 malloc 调用?

到目前为止,我找不到有关此的任何其他信息。

非常感谢您的帮助。最佳,罗马

0 投票
2 回答
635 浏览

task - 在 MicroC/OS II (ucos ii) 中更改优先级会更改任务 ID?

我有几个 RTOS(pSOS、VxWorks、QNX)的经验,但是我是 MicroC/OS II(ucos ii)的新手。我看到 ucos ii 的独特之处在于它使用优先级来唯一标识任务,并且所有任务都必须具有不同的优先级,因此不支持轮询调度,而不是具有唯一的任务 ID。我就这么理解。这是问题:

如果我使用 OSTaskChangePrio() 更改任务的优先级,这不会导致存储刚刚更改其优先级的任务的优先级(任务 ID)的任何代码或其他任务出现问题。实际上,更改优先级会更改任务的身份。这怎么不是问题?