私信报错 | 可以了
#if 1 /* 编译开关 */#include "CosyOS.H" // 用户的各个c文件中应包含此文件
#include <stdio.h> // for printf
/*-----------------------*
| 创建任务 - 参数说明表 |
|-----------------------+-----------------------------------------------------------*
| 任务名称 | 任务优先级 | 任务栈大小 | 安全运行时 | 任务名称文本(兼容模式) |
|----------+------------+------------+------------+---------------------------------|
| task_1 | 1级 | 384字节 | 0为无限长| 0为自动引用任务名称,即"task_1" |
|----------+------------+------------+------------+---------------------------------|
| task_2 | 2级 | 384字节 | 9滴答周期| "task_led"为任务名称文本 |
*-----------------------------------------------------------------------------------*/
/*
注意事项 for 8051:
1、在默认情况下,任务栈SIZE不允许大于255。
2、只有在启用了XBPSTACK的任务切换现场保护时,任务栈SIZE才允许大于255,最大可为65535。
*/
uExternTaskmsg(task_3, 1, 192, 0, "task_key", 1)(unsigned int);
uExternTaskmsg(task_4, 1, 192, 0, "task_key1", 1)(unsigned int);
/* 静态创建 task_1 */
uCreateTask(task_1, 1, 192, 0, "Test_task1")
{
while(1){
printf("task_1\r\n");
uDelay_ms(1000);
P20 =! P20;
}
}
/* 动态创建 task_2 */
uCreateTask(task_2, 2, 192, 0, 0)
{
while(1){
printf("task_2\r\n");
uDelay_ms(500);
P21 =! P21;
}
}
/* 静态创建私信任务 task_1 */// 1个私信参数
uCreateTaskmsg(task_4, 1, 192, 0, "task_key1", 1)(unsigned int tm1)
{
while(1){ // 已内置循环,此循环可省略
if(uRecvTaskmsg(xTick_ms(2000))){ // 接收私信,超时时间为2000毫秒,返回值为真表示接收成功
printf("task_4: %u, %u\r\n", tm1++, (unsigned int)&tm1);
uDelay_ms(1000);
uSendTaskmsg(task_3)(tm1); // 发送私信至 task_3
}
}
uEndTaskmsg(); // 结束私信任务
}
/* 静态创建私信任务 task_1 */// 1个私信参数
uCreateTaskmsg(task_3, 1, 192, 0, "task_key", 1)(unsigned int tm1)
{
while(1){ // 已内置循环,此循环可省略
if(uRecvTaskmsg(xTick_ms(2000))){ // 接收私信,超时时间为2000毫秒,返回值为真表示接收成功
printf("task_3: %u, %u\r\n", tm1++, (unsigned int)&tm1);
uDelay_ms(1000);
uSendTaskmsg(task_4)(tm1); // 发送私信至 task_2
}
}
uEndTaskmsg(); // 结束私信任务
}
/*
* 启动钩子
* 除了启动用户任务以外,启动钩子还适用于那些允许缓期执行的、
* 需要开中断以后执行的、需要调用任务级服务执行的初始化工作。
* 如果不想在启动任务过程中进行任务调度,可开启调度锁。
*/
void start_hook(void)
{
//uScheduleLock();
//uStartTask_Ready(task_1); // 启动 task_1,初始状态为就绪状态
//uStartTask_Ready(task_2); // 启动 task_2,初始状态为就绪状态
uSendTaskmsg(task_3)(1);// 发送私信至 task_1
uStartTask_Ready(task_3); // 启动 task_1,初始状态为就绪状态
uStartTask_Ready(task_4); // 启动 task_1,初始状态为就绪状态
// uStartTaskmsg(TaskMsgTest, 123); // 私信任务启动
//uScheduleUnlock();
}
#endif
uExternTaskmsg(task_3)(unsigned int);
uExternTaskmsg(task_4)(unsigned int);
可以了; 小坤 发表于 2026-5-27 22:14
uExternTaskmsg(task_3)(unsigned int);
uExternTaskmsg(task_4)(unsigned int);
恭喜你解决了问题。
在这个例子中,可以仅声明 task_3 即可。
原因是:
1、在 LINE_53 要发送私信至 task_3,而 task_3 却是在后面(LINE_61)定义的,所以需要提前声明。
2、在 LINE_67 要发送私信至 task_4,而 task_4 已经在前面(LINE_47)定义了,所以可以不用声明。
3、在启动钩子中,无论是发送私信至任务,还是启动任务,这些任务都已经在前面定义过了。
其实就是全局变量和函数的使用原则。
如果在前面已经定义过了,直接引用即可;
如果是在后面定义的,就需要提前声明一下。
页:
[1]