标签: rtos

抢占和上下文切换之间的区别

一点介绍,

我目前正在编写一个小的(读取微小的)RTOS内核,它应该与内核中的大多数内容单片.但是我找不到下面列出的一些事情的很多信息,这将是非常有用的,除此之外,它实际上不是某种大学项目,而是我正在按照自己的意愿行事.

回答所有问题的一个更好的选择是,如果你可以向我推荐一个免费提供的RTOS(甚至免费书籍),最好是实现用户空间并且是可抢占的(但不像linux那样复杂).Linux有一些我迄今为止看过的最糟糕的文档(我确实尝试过从linux代码中解决问题,但是只有大量的定义分散在一百万个文件和函数钩子中,并且有很多名字,每个版本都会重命名有时感动...)

  1. "抢占"和"上下文切换"有什么区别?

  2. 抢占式和非抢占式内核之间的主要区别是什么?程序员需要做什么工作才能使内核抢占先机?

  3. 如何创建和使用用户模式?

    ARM文档说,在用户模式下,任何切换到特权模式的指令都将被视为未定义指令.

  4. 如果是这样,用户空间程序使用内核代码的唯一方法是系统调用?

  5. 内核如何响应用户空间或与之交互?

  6. 这是否意味着启动后(在一个简单的系统中)唯一的内核线程将是空闲线程?

  7. 如果在切换到用户进程时取消映射内核代码和数据所在的页面,那么在系统调用或中断时,内核代码如何在不映射到虚拟地址空间的情况下执行?

  8. "可抢占的内核"是否仅仅意味着内核的设计方式使得在执行内核代码期间进行上下文切换是安全的?或者它是否需要做更多的工作?

哦,如果这里不允许这么多问题,抱歉,找不到任何相关的内容.

architecture kernel arm rtos

8
推荐指数
1
解决办法
6185
查看次数

OS调度与RTOS调度的区别

考虑功能/过程,

void task_fun(void) { while(1) } 如果这个过程是在普通的PC操作系统上运行的话,它会很乐意永远运行.但是在手机上,随着硬件监视器到期并重置系统,它肯定会在几分钟内崩溃整个手机.在PC上,此过程在其到期后的规定时间片将被安排出来,并且将安排新的可运行过程运行.

我怀疑为什么我们不能在RTOS上应用相同的策略?如果在RTOS上实施这样的调度策略,所涉及的性能限制是什么?

另一个疑问是我检查了schedule()我的PC OS(Ubuntu)和我的手机的功能,它也运行Linux内核.我发现它们几乎都是一样的.看门狗在我手机上的处理方式在哪里?我的假设是调度程序是在让进程运行之前启动监视程序的人.有人能指出我在代码中的位置吗?

linux operating-system scheduling rtos linux-kernel

7
推荐指数
1
解决办法
5022
查看次数

在Windows上进行原型设计和仿真嵌入式软件

我正在寻找用于原型设计(虚拟原型设计),模拟和测试桌面Windows上深度嵌入式C代码的工具和技术,包括构建由按钮,LED和LCD显示器(分段和图形)组成的逼真的嵌入式前面板.

我特别感兴趣的是一种可能的低级方法,使用纯C代码和原始Win32 API而不是MFC,.NET/C#,vxWidgets或Qt.我还想使用免费的开发工具,例如Visual C++ Express with Platform SDK和ResEdit来编辑资源.

我正在寻找代码示例来渲染图形LCD(从单色到24位颜色),具有高效的像素级接口,多段LCD和自拍式按钮,可响应"低压"和"释放"事件.

embedded prototyping rtos visual-studio-express visual-studio

7
推荐指数
1
解决办法
2888
查看次数

为什么在此禁用中断?

static void RadioReleaseSPI(void) {
    __disable_interrupt();
    spiTxRxByteCount &= ~0x0100;
    __enable_interrupt();
}
Run Code Online (Sandbox Code Playgroud)

我知道多个任务可能会尝试使用SPI资源.spiTxRxByteCount是一个全局变量,用于跟踪SPI当前是否正被另一个任务使用.当任务需要SPI时,它可以检查状态spiTxRxByteCount以查看是否正在使用SPI.当使用SPI完成任务时,它会调用此函数并清除该位,以指示SPI现在是空闲的.但为什么要先禁用中断然后再重新启用呢?只是偏执狂?

c embedded rtos

7
推荐指数
2
解决办法
2615
查看次数

软实时Linux调度

我有一个具有一些软实时要求的项目.我有两个进程(我编写的程序)进行一些数据采集.在任何一种情况下,我都需要不断读入正在进入并处理它的数据.

第一个程序是严格的线程,第二个程序使用一个应该是线程的库,但我不知道幕后发生了什么.每个程序都由用户执行,并且(默认情况下)我看到每个程序的优先级为20,漂亮的值为0.每个程序使用大约30%的CPU.

就目前而言,两个进程都必须与一些后台进程争用,我想尽可能地为我的两个程序提供最好的CPU.我的主要问题是我有一个与之交谈的设备,它有一个64字节的硬件缓冲区,如果我没有及时读取它,我会得到溢出.我注意到这种情况每运行2-3小时就会发生一次.

根据我的研究(http://oreilly.com/catalog/linuxkernel/chapter/ch10.html),似乎有三种方法可以优先使用:

  1. 将nice值设置为较小的数字,因此为每个进程提供更多优先级.我可以使用nice命令在不对代码进行任何修改(或使用系统调用)的情况下执行此操作.

  2. 将sched_setscheduler()用于特定调度策略的整个过程.

  3. 使用pthread_setschedparam()分别设置每个pthread.

我遇到了以下障碍:

  1. 假设我选择3,如何防止低优先级线程被饿死?是否还有一种方法可以确保共享锁将优先级较低的线程提升到更高的优先级?假设我有一个实时的线程,SCHED_RR并且它与默认的SCHED_OTHER线程共享一个锁.当SCHED_OTHER线程获得锁定时,我希望它执行@更高优先级以释放锁定.我如何确保这一点?

  2. 如果SCHED_RR的一个线程创建另一个线程,新线程是自动SCHED_RR,还是我需要指定它?如果我有一个我已设置为SCHED_RR的进程,它的所有线程是否自动遵循此策略怎么办?如果SCHED_RR的进程产生子进程怎么办,它是否太自动SCHED_RR?

  3. 鉴于代码仅占用CPU的60%,这是否有任何问题?或者是否仍然存在CPU与后台进程共享的问题,我应该关注并可能导致我的缓冲区溢出?

抱歉这个冗长的问题,但我觉得它需要一些背景信息.在此先感谢您的帮助.

c linux embedded real-time rtos

7
推荐指数
1
解决办法
1035
查看次数

RTOS如何从中断切换任务

假设有两个任务正在运行TASK_A和TASK_B.当TASK_A正在运行时发生中断并且需要上下文切换到TASK_B.

在ISR内部,TASK_B不应该直接跳转,因为它仍然在ISR中并且还没有返回(例如:RETI未执行).如果通常从ISR返回,它将照常返回TASK_A的最后一个程序计数器.因此,RTOS必须退出ISR,一旦它离开ISR,就必须进行到TASK_B的上下文切换.而不是回到TASK_A,RTOS退出ISR后如何立即取回控制权.

如果从RTOS功能切换,例如在解锁互斥锁时,可以通过备份寄存器来进行直接切换.

RTOS如何处理这种情况

请原谅我这是一个普遍的问题......

rtos freertos

7
推荐指数
2
解决办法
4598
查看次数

实现实时 1 毫秒精确事件而不受线程调度的影响

问题

我正在使用.Net 4.5创建一个基于 Windows 7 的 C# WPF应用程序,它的一个主要功能是调用某些函数,这些函数与具有一组用户定义的循环时间的自定义硬件接口。例如,用户可能会选择每 10 或 20 毫秒调用两个函数以及每 500 毫秒调用另一个函数。用户可选择的最小循环时间为 1 毫秒。

起初,时间似乎是准确的,并且根据需要每 1 毫秒调用一次函数。但是我们后来注意到大约1-2%的时间是不准确的,有些函数被调用只延迟了 5 毫秒,而其他函数可能会延迟到 100 毫秒。即使循环时间大于 1 毫秒,我们也面临线程休眠的问题,它应该调用外部函数(一个 20 毫秒的函数可能会延迟 50 毫秒调用,因为线程正在休眠并且没有调用该函数)

经过分析,我们得出结论,这些延迟是零星的,没有明显的模式,这些延迟背后的主要原因可能是操作系统调度和线程上下文切换,换句话说,我们的线程并没有像我们需要的那样一直处于唤醒状态.

由于 Windows 7 不是 RTOS,我们需要找出是否可以以某种方式解决此问题。但我们确实知道这个问题在 Windows 上是可以解决的,因为我们使用其他具有类似功能的工具,可以满足最大 0.7 ms 容错的时序约束。

我们的应用程序是多线程的,最多同时运行 30 个线程,其当前 CPU 使用率峰值约为 13%

尝试的解决方案

我们尝试了很多不同的东西,主要是使用秒表计时器测量计时,并且IsHighResolution为 true(使用了其他计时器,但我们没有注意到太大差异):

  1. 创建一个单独的线程并赋予它高优先级
    结果:无效(使用可怕的Thread.Sleep(),没有它并使用连续轮询)

  2. 使用 C# 任务(线程池)
    结果:改进很小

  3. 使用 1ms 周期的多媒体定时器 …

c# windows multithreading rtos windows-kernel

7
推荐指数
1
解决办法
6484
查看次数

RTOS删除练习中显式堆栈的替代方法?

在基于ARM7的C上编程的嵌入式应用程序(具有可移植性要求)中,当前使用基于商业优先级的抢占式RTOS,我们需要根据客户要求删除该RTOS和任何RTOS依赖关系.我们有8个任务使用许多HW接口,睡眠语句,I2C通信.实际上,SW很好地利用了RTOS功能来简化代码,尽管在没有RTOS的情况下可以管理时序要求.

几个函数,包括在许多地方调用的例程,当前实现阻塞(对于该线程)调用I2c驱动程序函数,睡眠语句等的序列.基于对客户不接受对I2C调用/休眠进行轮询的前提,此类调用必须然后是非阻塞并返回.问题当然是"返回"到"声明",当I2C完成或睡眠时间已经过去时,可能从顶层任务进入4次调用.

我正在为每项任务收集分层状态机设计,并在顶部安装一个简单的调度程序.但是处理几个例程,用于制作当时阻塞调用的序列,现在变成每个状态机,可以在几个地方和不同的函数调用深度调用,似乎需要为每个任务提供显式的堆栈功能,以便每次我启动子状态机时,我都可以为该进程分配状态并将它们推送到该任务的"状态堆栈",以便下一个调度程序对该任务的调用将能够完成所有分层状态继续处理它"停止"的地方.

您是否可以看到适用于该问题的其他设计架构,将代码快速移植到非抢占式范例的注意事项,或者指向富含思想的资源以及有关"RTOS移除"技术和设计的讨论?


这三个答案共同描绘了基于状态机的开发相关性和相关工具的良好画面,以避免重新发明轮子.我们的客户不会获得任何形式的许可,包括GPL.从答案中可以看出,如果想要使用没有RTOS的分层状态机并且禁止轮询呼叫,则无法绕过缓存状态.由于分层SM通过保留其结构(对例程的函数调用变为子状态机的调用)来帮助移植现有代码,所以我将使用提供的工具作为好例子.- 谢谢.

architecture embedded multithreading rtos

6
推荐指数
2
解决办法
1153
查看次数

操作系统如何处理上下文切换?

据我所知,每个操作系统都需要有某种机制来定期检查它是否应该运行某些任务并暂停其他任务。

一种方法是某种计时器,操作系统将在其到期时检查它是否应该运行/挂起某个任务。

一般来说,在可能是某种 ISR 的 ARM 系统上说。

我真正的问题是,我一直只能想象这一点,而没有在某处看到它。有人可以指出一些免费/开放的 RTOS 代码,我可以在其中实际看到处理抢占/调度的代码吗?

operating-system rtos scheduled-tasks

6
推荐指数
1
解决办法
1124
查看次数

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

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

我正在使用IAR EWARM工具链。我正在考虑使用cmocka,Unity或Cunit。我正在学习将µC / OS-III用作RTOS。

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

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

#ifdef UNIT_TEST
test_runner();
#else
OSStart(&err);
#endif
Run Code Online (Sandbox Code Playgroud)

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

那是做到这一点的最好方法。还是我更适合启动内核,为我的测试运行者创建任务,并从一个线程中运行所有任务,或者是否有其他好的方法涉及从测试工具中生成其他任务。

c unit-testing rtos ucos

6
推荐指数
1
解决办法
2419
查看次数