如果我有两个任务TASK_A和TASK_B.
堆栈大小TASK_A = 300
堆栈大小TASK_B = 600
TASK_A和TASK_B的上下文切换时间是否依赖于它们各自的堆栈大小.
我在FreeRTOS中使用xTaskCreate,其第四个参数(void*const)是传递给新线程调用的函数的参数.
void __connect_to_foo(void * const task_params) {
void (*on_connected)(void);
on_connected = (void) (*task_params);
on_connected();
}
void connect_to_foo(void (*on_connected)(void)) {
// Start thread
xTaskCreate(
&__connect_to_foo,
"ConnectTask",
STACK_SIZE,
(void*) on_connected, // params
TASK_PRIORITY,
NULL // Handle to the created Task - we don't need it.
);
}
Run Code Online (Sandbox Code Playgroud)
我需要能够传入一个带签名的函数指针
void bar();
但我无法弄清楚如何将void*转换为我可以调用的函数指针.我能得到的最近的是:
错误:'void*'不是第3行的指针对象类型
如何将task_params转换为我可以调用的函数指针?
注意,上面的代码大大简化了.
我的FreeRTOS构造中有一个树形的流程/任务架构。main()只需创建一个RootTask(在初始化HAL之后),即可创建另外两个任务,依此类推。
我目前正在与Flash大小(基本上是代码+常量?)战斗,因此禁用任务(=对它们进行注释),以便向编译器显示甚至不需要大多数翻译单元,从而找出哪些模块最昂贵。
但是,我已经对main()提出了自己的看法,并取出了while(1)循环以外的所有内容。它仍然不适合128k Flash。尝试删除所有C ++转换单元,甚至使用gcc进行链接;但是仍然有大约100k个“ .text”部分(考虑到应用程序不执行任何操作,此时我可以选择10k)。
我正在使用arm-none-eabi-gcc / g ++ 5.4.1。链接描述文件由ST-CubeMX生成。
gcc标志:
-mcpu=cortex-m0 -mthumb -Os -s -Wall -Wa -a -ad -alms=build/$(notdir $(<:.c=.lst))
链接器标志:(
-mcpu=cortex-m0 -specs=nosys.specs -T$(LDSCRIPT) [some-libraries] -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections,--undefined=uxTopUsedPriority,-flto
也由CubeMX生成,但-flto除外)
有人可以解释为什么编译器/链接器没有从最终二进制文件中删除未使用的代码吗?是否有进一步调查的工具?
请让我知道是否需要更多信息。
谢谢!
我是 FreeRTOS 和实时操作系统的新手。我想知道在 FreeRTOS 任务中实现功能是否是一种好的编程风格。例如
void displayTask(void* param) {
static void Factorial (params) {
// doSth
}
for(;;) {
//call it here
Factorial(params);
}
}
Run Code Online (Sandbox Code Playgroud)
还是只是在任务之外实现它更好?,因为如果我有很多功能,我猜很难阅读代码。
从std::shared_ptr 线程安全等文章中,我知道 std::shared_ptr 的控制块按标准保证是线程安全的,而指向的实际数据本质上不是线程安全的(即,它是对我来说,作为用户,做到这一点)。
我在研究中未能找到如何保证这一点的答案。我的意思是,具体使用什么机制来确保控制块是线程安全的(因此对象只被删除一次)?
我问这个问题是因为我正在将 newlib-nano C++ 库与 FreeRTOS 一起用于嵌入式系统。这两者本质上并不是为了相互协作而设计的。由于我从未编写过任何代码来确保控制块是线程安全的(例如,没有关键部分或互斥体的代码),因此我只能假设它实际上可能不是 FreeRTOS 线程安全的。
最近我一直在为ARM和PIC设备开发自己的RTOS,所以我正在分析当前的RTOS概念.我在学习FreeRTOS时有些疑惑,
它如何处理函数变量?我们如何管理函数内的变量?
例1:
我们在FreeRTOS中的函数A和B的两个线程中声明了一个局部变量'i',但是函数A的变量'i'受函数B的影响.
EX-2:
我们有两个线程A,B和一个像延迟的函数.但是线程A和B都调用相同的函数delay
.FreeRTOS如何为两个线程(A和B)分配单个延迟资源?
我想在 STM32F407VGT6 MCU 上移植 freeRTOS。我搜索了网络,但没有找到任何合适的链接来执行此操作。请建议一种合适的方法来实现此目的或任何描述这些步骤的网络链接。
谢谢阿米特
编辑:-我想在 STM32F4 发现板上移植 freeRTOS