QP_RTOS 笔记

目录

 

1.QP&UCOSII 任务创建笔记

2.UCOS 任务统计

3.消息池的大小


1.QP&UCOSII 任务创建笔记

1.

QP中的UCOSII版本,每次创建任务都调用一个函数,task_function()

利用不同的pdata参数,来确定那个任务选哟执行的状态机,状态机各自都有自己的阐述,

这种方式很好,以前没有怎么想过。

2.UCOS 任务统计

在这个版本中 OS的任务统计 没有做,需要在任务执行调用一次,这样就可以知道知道100ms 执行多少次空闲的计数器。利用这个来做基准。

计算CPU的利用率。

3.消息池的大小

消息池如果太少,程序中有一些耗时操作,反应不过来,这个时候,当前的任务的消息池就会越来越多,造成死机。

所以编写程序和裸机实际也差不多,最好不要死等。

有些东西,也可以直接用原生态的OS 处理一些任务。直接发送消息出来即可。

4.LIFO  api

很重要的一个API,这个相当于是个搞了一个优先级,会得到先执行

 

<think>我们面对的是一个条件编译问题:在C/C++中,当定义了宏`with_rtos=1`时,`#if !with_rtos`后面的代码块是否会被编译? 关键点在于理解`#if`条件表达式的求值规则。 在C/C++预处理中,`#if`后面的表达式是常量表达式,它会对宏进行展开并求值。特别地: - 如果宏`with_rtos`被定义为1,那么`!with_rtos`就是`!1`,即0。 - 因此,`#if 0`后面的代码块将不会被编译。 但是,这里有一个细节:宏定义中`with_rtos=1`,这通常不是标准的宏定义方式。标准的宏定义有两种: 1. 定义宏,不带值:`#define with_rtos` 2. 定义宏并给值:`#define with_rtos 1` 在条件编译中,如果使用`#define with_rtos`(即不带值),那么`with_rtos`在`#if`中会被视为值为1(因为定义了),但这里我们讨论的是`with_rtos=1`,这很可能是想表达`#define with_rtos 1`。 因此,我们假设预处理器中已经存在: #define with_rtos 1 那么: `#if !with_rtos` 会被展开为 `#if !1`,即`#if 0`,所以条件不成立,后面的代码块不会编译。 但是,如果宏定义是: #define with_rtos 0 那么`#if !with_rtos`就会变成`#if !0`,即`#if 1`,所以条件成立,后面的代码块会被编译。 另外,如果宏没有被定义,那么`with_rtos`在`#if`中会被视为0(未定义),因此`#if !with_rtos`就是`#if !0`,即`#if 1`,所以后面的代码块会被编译。 总结: - 当`with_rtos`被定义为非0值时(比如1),`#if !with_rtos`为假(0),代码块不会编译。 - 当`with_rtos`被定义为0时,`#if !with_rtos`为真(1),代码块会编译。 - 当`with_rtos`未被定义时,`#if !with_rtos`为真(1),代码块会编译。 因此,针对用户的问题:设置`with_rtos=1`(即`#define with_rtos 1`)时,`#if !with_rtos`后面的函数不会编译。 注意:在条件编译中,我们通常使用: #ifdef MACRO // 如果定义了MACRO,则编译 #ifndef MACRO // 如果未定义MACRO,则编译 或者使用带值的: #if MACRO // 如果MACRO的值不为0,则编译 #if !MACRO // 如果MACRO的值为0,则编译 所以,在写条件编译时,需要明确宏定义的方式。 为了验证,我们可以看一个简单的例子: 示例1:定义with_rtos为1 #define with_rtos 1 #if !with_rtos // 这段代码不会编译 #endif 示例2:定义with_rtos为0 #define with_rtos 0 #if !with_rtos // 这段代码会编译 #endif 示例3:没有定义with_rtos #undef with_rtos #if !with_rtos // 这段代码会编译(因为未定义时,在条件表达式中被视为0,所以!0就是1) #endif 因此,根据用户提供的情况(设置with_rtos=1),后面的函数不会执行(即不会被编译)。 注意:这里所说的“执行”是指代码在编译阶段被包含进程序,而不是运行时执行。因为条件编译是在编译预处理阶段决定的。 所以,答案是不会编译。</think>在C/C++中,当设置`with_rtos=1`时,`#if !with_rtos`后的代码块**不会编译**,具体分析如下: ### 关键原理 1. **宏定义求值规则** `#if`指令会进行宏展开和整数常量表达式求值: - `#define with_rtos 1` → `with_rtos`被替换为整数`1` - `!with_rtos` → `!1` → 结果为`0` - `#if 0` → 条件为假,代码块被跳过 2. **预处理器行为** 预处理器在编译前处理条件指令: ```c #define with_rtos 1 // 宏定义 #if !with_rtos // 展开为 #if !1 → #if 0 void disabled_func() { ... } // 此函数不会进入编译阶段 #endif ``` ### 验证示例 ```c #include <stdio.h> #define with_rtos 1 #if !with_rtos void unused_function() { printf("This will NEVER be compiled"); } #endif int main() { // 即使调用函数,链接阶段也会报错(函数未定义) // unused_function(); // 取消注释会导致编译错误 return 0; } ``` - **编译结果**: `gcc -c test.c` 成功(无错误),通过`nm test.o`检查符号表可确认`unused_function`不存在[^1]。 ### 特殊情况处理 | 宏定义状态 | `#if !with_rtos` 结果 | 是否编译 | |---------------------|----------------------|----------| | `#define with_rtos 1` | `#if !1` → 假 | ❌ | | `#define with_rtos 0` | `#if !0` → 真 | ✅ | | 未定义宏 | `#if !0` → 真 | ✅ | > ⚠️ 注意:若宏定义为字符串(如`#define with_rtos "1"`),预处理器会将其视为`0`,导致`#if !with_rtos`为真[^2]。 ### 最佳实践建议 1. 明确宏类型: 使用整数宏而非字符串,如`#define WITH_RTOS 1` 2. 防御性条件检查: ```c #if defined(WITH_RTOS) && (WITH_RTOS == 1) // RTOS相关代码 #else // 非RTOS代码 #endif ``` --- ### 相关问题 1. 如何检查代码中未编译的条件块? 2. `#ifdef`和`#if defined()`有何区别? 3. 宏定义值为字符串时如何影响条件编译? 4. 如何防止条件编译导致的代码维护问题? [^1]: 验证方法:使用`gcc -E`查看预处理输出,或`objdump`检查二进制符号。 [^2]: C标准规定:预处理器将非整数宏视为值`0`(C11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值