我们是学生在大学里开发一个中型(~4.5英尺高)人形机器人作为赞助研究项目.机器人应该能够执行的主要任务包括:四处移动(向前,向后,侧向),跑步,拾取物体.我们正在考虑使用硬实时操作系统来控制机器人.但是,由于我们是这个领域的新手,几乎没有嵌入式系统或操作系统的背景,并且有多种选择,我们不确定哪一个是合适的选择.我们遇到以下情况(括号内是我们目前对它们的印象):
我有很多问题:
更新:感谢您提供非常详细的答案.很明显,我们以错误的方式解决这个问题; 没有任何知识和vauge要求潜水肯定会很糟糕.我们必须坐下来,准确地说出我们需要的东西.当我们充分领先时,我们将尝试找出合适的操作系统.让我们看看它是如何运作的.我还将阅读MicroC OS II的第2章:实时内核.
有没有人已经在cortexM3节点上实现了zeroMQ作为可靠的消息解决方案?我试图了解它是否可能并且有一个内存足迹的想法.我可能会有freeRTOS OS.感谢您的想法和建议.尼古拉
在创建或管理免费RTOS的任务中,x和v是什么意思?xTaskcreate还是vTaskcreate?
在学习了有关中断优先级的一些知识之后,我仍然有点困惑,试图理解允许HAL_NVIC_SetPriority()
在SysTick_IRQn
(每 1 毫秒调用 FreeRTOS 调度程序的 ISR)上调用什么值。
我的一部分认为HAL_NVIC_SetPriority(SysTick_IRQn, 15 ,0U)
(可能的最低优先级)和HAL_NVIC_SetPriority(SysTick_IRQn, 10 ,0U)
(更高一点)之间的任何内容都是允许的,而我的一部分认为HAL_NVIC_SetPriority(SysTick_IRQn, 15 ,0U)
(可能的最低优先级)和HAL_NVIC_SetPriority(SysTick_IRQn, 5 ,0U)
(更高一点)之间的任何内容都是允许的。这是假设configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
在 FreeRTOSConfig.h 中设置为 5。令人困惑的是,在 FreeRTOS 中,数字越大优先级越高,但在 STM32 中,数字越高优先级越低,并且文档非常难以理解。
为了证明我已经做出了勇敢的努力,也为了帮助大家帮我填补空白,以下是我目前的理解。我将以这样一种方式写下我所知道的真实情况的描述,看起来像是我在教你,尽管我正在寻求上述问题的答案,以及 更正、确认或补充您认为合适的洞察力。
尽管这可能适用于许多 STM32 微控制器或系列,但让我们特别针对 STM32F207ZG 进行讨论。
注意:STM32CubeF2下载在这里。
如果您查看标准FreeRTOSConfig.h文件(例如:STM32Cube_FW_F2_V1.7.0/Projects/STM322xG_EVAL/Applications/FreeRTOS/FreeRTOS_ThreadCreation/Inc/FreeRTOSConfig.h),您将看到以下内容:
/* Cortex-M specific definitions. */
#ifdef __NVIC_PRIO_BITS
/* __BVIC_PRIO_BITS will be specified when CMSIS is …
Run Code Online (Sandbox Code Playgroud) 我正在使用FreeRTOS + LwIP开发基于以太网的床边护士呼叫设备.在阅读了一些示例和文档后,我想使用LwIP的netconn API在TCP下发送和接收数据,因为我不熟悉BSD样式API,原始API可能很难.
我知道该netconn_accept()
函数将阻止进程,直到来自远程主机的连接请求到达,并且该netconn_recv()
函数还将在等待数据到达时阻止进程...这两个函数都将阻止进程,这对服务器有利然而,接收数据时,我的设备还需要充当客户端,当患者按下按钮时需要触发对护士中心的"呼叫".那么在它还在等待远程主机的连接(阻塞进程)时,它如何启动发送TCP数据包呢?
我需要发送TCP,因为我必须使用SIP(会话启动协议)来发起呼叫,它应该是可靠的,因为它是一个医疗设备.非常感谢你
@Kyle Heironimus,@ werewindle我将你添加到我的问题中,因为我知道你有LwIP的经验,希望不会给你带来不便,希望你能提供帮助,谢谢.
假设有两个任务正在运行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如何处理这种情况
请原谅我这是一个普遍的问题......
以下是STM32微控制器上的数据类型:http : //www.keil.com/support/man/docs/armcc/armcc_chr1359125009502.htm。
这些微控制器使用32位ARM核心处理器。
哪些数据类型具有自动原子读取和原子写入访问权限?
我很确定所有32位数据类型都可以(因为处理器是32位),而所有64位数据类型都不能(因为要读或写一个64位字至少需要2个处理器操作),但是bool
(1个字节)和uint16_t
/ int16_t
(2个字节)呢?
上下文:我正在STM32上的多个线程(在FreeRTOS中称为单核,但有多个线程或称为“任务”)之间共享变量,并且需要知道是否需要通过使用中断关闭中断来强制进行原子访问互斥锁等
更新:
参考此示例代码:
volatile bool shared_bool;
volatile uint8_t shared u8;
volatile uint16_t shared_u16;
volatile uint32_t shared_u32;
volatile uint64_t shared_u64;
volatile float shared_f; // 32-bits
volatile double shared_d; // 64-bits
// Task (thread) 1
while (1)
{
// Write to the values in this thread.
// What I write to each variable will vary. Since other threads
// are reading these values, I need to …
Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个esp32应用程序,同时启用了蓝牙和wifi。
蓝牙与a2dp配置文件一起使用,其中esp是接收器。收到数据后,应通过UDP套接字发布该数据,以广播到网络。
问题是天线。bt和wifi都在共享它。a2dp流似乎永久获取天线并很少释放它(〜2个包/分钟,我有〜3000个包/分钟)。
所以我的问题是:是否可以获取某种信号量以完全控制天线?这样我的套接字就能将数据发送到网络吗?
我将我的esp32与freeRTOS一起使用。freeRTOS库是用C编写的,但是我正在尝试将所有内容都包装在C ++中。我仍然认为此问题与C库有关,因此我将其标记为C。
我欢迎任何建议如何建立它。提前致谢。
更新:
我正在使用release/v3.3
官方esp-idf
回购。
我有:CONFIG_SW_COEXIST_ENABLE=y
和CONFIG_SW_COEXIST_PREFERENCE_WIFI=y
我CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE
在配置中找不到。
提到的配置不起作用。
我尝试阅读该帖子,但在我的lib中找不到任何“ scan_window
”或“ scan_interval
”。据记载,它在某处,gap_api
但找不到。
这是我的代码+配置:https : //github.com/Dimfred/esp32_bt_streamer
套接字客户端任务(应广播a2dp_msg
)从此处开始:https :
//github.com/Dimfred/esp32_bt_streamer/blob/master/main/app/event_handler.cpp#L22
从工作站/访问点/蓝牙/ a2dp弹出的所有事件都捕获在event_handler.hpp / cpp中
我开始学习FreeRTOS.刚才我正在尝试用这段代码创建一个打印任务函数:
static void vTaskPrint(void *pvParameters) {
taskENTER_CRITICAL();
printf("%s", (char *)pvParameters);
printf("xPortGetFreeHeapSize: %d\r\n", xPortGetFreeHeapSize());
taskEXIT_CRITICAL();
vTaskDelete(NULL);
}
Run Code Online (Sandbox Code Playgroud)
但在14次致电之后:
xTaskCreate(vTaskPrint, (char *)"vTaskPrint", configMINIMAL_STACK_SIZE, (void *)buffer, 3, (xTaskHandle *)NULL);
Run Code Online (Sandbox Code Playgroud)
皮质M3内存不足:
************** TEST GPIO & LEDS FREERTOS OPEN103Z EVB **************
vTaskLeds
xPortGetFreeHeapSize: 7832
vTaskReadKeys
xPortGetFreeHeapSize: 7232
[INFO] vTaskPrint created successful
Key pressed RIGHT
xPortGetFreeHeapSize: 6632
[INFO] vTaskPrint created successful
Key pressed CENTER KEY
xPortGetFreeHeapSize: 6032
[INFO] vTaskPrint created successful
Key pressed RIGHT
xPortGetFreeHeapSize: 5432
[INFO] vTaskPrint created successful
Key pressed LEFT
xPortGetFreeHeapSize: 4832
[INFO] …
Run Code Online (Sandbox Code Playgroud) 使用以下设置:
使用 JLinkGDBServer 和 eclipse 作为调试前端,我在单步执行我的代码时总是有一个很好的堆栈跟踪。使用 Code Confidence freertos 工具(eclipse 插件)时,我还会看到当前未运行的所有线程的堆栈跟踪(没有该插件,我只能看到活动线程的堆栈跟踪)。到现在为止还挺好。
但是现在,当我的应用程序陷入硬故障时,堆栈跟踪就会丢失。嗯,我知道如何找出导致hardfault代码地址的技术(如看到这里)。但与完整的堆栈跟踪相比,这是非常糟糕的信息。
好的,有时当陷入硬故障时,无法保留堆栈跟踪,例如,当堆栈被错误代码损坏时。但是如果堆栈是健康的,我认为获得堆栈跟踪是可能的(不是吗?)。
我认为在硬故障时丢失堆栈跟踪的原因是,Cortex-M3 架构会自动将堆栈指针从 PSP 切换到 MSP。现在的一个想法是,(也许)将 MSP 设置为之前的 PSP 值(并且可能需要做一些额外的堆栈准备?)。
关于如何做到这一点或其他方法在硬故障时保留堆栈跟踪的任何建议?
编辑 2015-07-07,添加了更多细节。
我使用此代码来引发硬故障:
__attribute__((optimize("O0"))) static void checkHardfault() {
volatile uint32_t* varAtOddAddress = (uint32_t*)-1;
(*varAtOddAddress)++;
}
Run Code Online (Sandbox Code Playgroud)
进入 时checkHardfault()
,我的堆栈跟踪看起来不错:
gdb-> backtrace
#0 checkHardfault () at Main.cxx:179
#1 0x100360f6 in GetOneEvent () at Main.cxx:185 …
Run Code Online (Sandbox Code Playgroud)