CosyOS
发表于 2024-10-29 23:19:37
本帖最后由 CosyOS 于 2024-10-30 22:47 编辑
DIY365 发表于 2024-10-29 14:41
CosyRTOS-STC8H
串口1接收中断没开启吗?
我打印接收数据,显示是串口2接收到的数据
测试程序中,默认
串口1用做 printf,串口2用做 Taskmgr。
串口1中断未开启、接收也未使能,ES = 0; REN = 0;
串口2中断已开启、接收也已使能,IE2 |= ES2; S2CON |= S2REN;
你 打印的是 s_debug_recvptr,当然是串口2(任务管理器)收到的数据了;
printf 就是从 串口1 打印出来的,因为没做重定向。
如还有疑问,先不要改动,仅调整 串口切换,而后进行测试。
任务管理器能正常收发,printf 能正常输出,
而后再按照自己的意图修改。
DIY365
发表于 2024-10-30 14:45:14
CosyOS 发表于 2024-10-29 23:19
测试程序中,默认
串口1用做 printf,串口2用做 Taskmgr。
串口1中断未开启、接收也未使能,EA = 0; REN...
EA = 1; REN = 1;
下载后测试发现依然无法接收到 uart1 的数据(自发自收)
任务管理器uart2是能够正常收发的。
然后printf(s_debug_recvptr);
改为printf(DMABuffer);
DMABuffer数组是我自己定义的。
下载后测试发现依然无法接收到 uart1 的数据(自发自收)/**************************************************************************//**
* @item CosyOS-II User
* @file Taskmgr.c
* @brief CosyOS-II 任务管理器
* @detail 当前配置为使用UART2,用户可自行调整。
正常情况下,下方代码中,您仅需调整:UART2_Isr、中断向量号、S2CON、S2TI、S2RI、S2BUF。
您需自行初始化串口、串口中断优先级、波特率等相关配置。
* @author 迟凯峰
* @versionV1.0.2
* @date 2024.05.11
******************************************************************************/
#include "..\System\os_link.h"
#if SYSCFG_DEBUGGING == __ENABLED__
#include "user.h"
u8 xdata DMABuffer;// 数据存放在XRAM(XDATA区域),需要使用关键字xdata
bit DmaTxFlag; // 发送完成标志
bit DmaRxFlag; // 接收完成标志
bit B_TX1_Busy; // 串口忙标志
u8 Rx_cnt; // Rx接收计数
u8 RX_TimeOut; // 串口接收超时计数
/* 应用示例 - 8051/80251 UART1 */
void UART1_Isr(void) interrupt 4
{
if (RI)// 接收完成标志置1时
{
RI = 0;// 清零接收完成标志
DMABuffer = SBUF;// 将接收到的数据存入缓冲区
if (Rx_cnt >= 256) Rx_cnt = 255;// 防止溢出
RX_TimeOut = 5;// 如果5ms内没有接收到新的数据,判定一串数据接收完毕
DmaRxFlag = 1;// 接收完成标志置1
}
if (TI)// 发送标志置1时
{
TI = 0;// 清零发送完成标志
B_TX1_Busy = 0;// 清零串口忙标志
DmaTxFlag = 1;// 发送完成标志置1
}
}
void UART2_Isr(void) interrupt 8// using 3
{
if(S2CON & S2TI){
S2CON &= ~S2TI;
if(*s_debug_sendptr){
S2BUF = *s_debug_sendptr++;
}
else{
iDebugSend;
}
}
if(S2CON & S2RI){
S2CON &= ~S2RI;
if(s_debug_recvptr - s_debug_recvbuff < OS_DEBUGRECVBUFFSIZE - 1){
*s_debug_recvptr++ = S2BUF;
}
iDebugRecv;
}
}
#endif
ES=1;
然后我将ES也设置,下载到单片机后系统不运行了。
Yang.Lian
发表于 2024-10-30 15:15:12
本帖最后由 Yang.Lian 于 2024-10-30 15:35 编辑
我插播一个简单的问题,
1. 创建一个二值信号量b
2. 创建一个 CTRL 任务,执行指定的操作,然后uLockBin(b) ; uTakeBin(b, 超时时间) 等待反馈
3. 创建一个定时中断任务,定时中断任务用于防抖处理,检测输入,如果检测到反馈就uGiveBin(b)
现在的问题是,CTRL 执行以后,如果超时,系统运行正常;如果不超时,检测到反馈,系统立即死机
我用类似的逻辑换成飞信,效果是一样的;
如果去掉这些同步代码,可以观察到反馈正常抵达。
补充一下,我判断死机的标准是
#define SYSCFG_DEBUGGING 1
的时候,会有定时的输出,当输出停止的时候,认定为死机
好吧,解决了,
由于刚开始没有防抖的要求,代码非常简单,所以直接用 hook 处理,后来发现必须要加防抖,就直接改了代码,但是忘记从 hook 改成 task
所以只需要将 3 中提到的假的定时中断任务(实际是定时中断 hook)改成 真的定时中断任务就好了
CosyOS
发表于 2024-10-30 22:49:38
Yang.Lian 发表于 2024-10-30 15:15
我插播一个简单的问题,
1. 创建一个二值信号量b
2. 创建一个 CTRL 任务,执行指定的操作,然后uLockBin(b) ...
恭喜你解决了问题,{:4_250:}
sdwys
发表于 2024-10-31 09:43:06
CosyOS 发表于 2024-10-28 00:06
首先是了解 三目运算。
(条件表达式) ? 表达式1 : 表达式2;
如果条件表达式为真,执行表达式1并返回结果 ...
我测试了下,结果作者看看对不对。
编译时根据(group)的值只编译对应的一段代码,例如 group = s_u8_t ,就只编译sizeof(group) == 1 ? *(s_u8_t*)&group ? true : false 这一段,其它被优化。执行结果,当 (group) 值 == 0时返回false,当(group) 值 != 0时返回true。
DIY365
发表于 2024-10-31 10:07:21
我刚发现一个小问题。
系统加入我自己的.c和.h程序之后,编译报错。
然后加上#include "..\System\os_link.h"就可以了。
CosyOS
发表于 2024-10-31 13:25:06
DIY365 发表于 2024-10-31 10:07
我刚发现一个小问题。
系统加入我自己的.c和.h程序之后,编译报错。
然后加上#include "..\System\os_link. ...
1、用户的各个c文件中应包含 os_link.h。
2、System、Config、Hook、Port,4个组为 CosyOS 文件;
其它组 User、Test 等,为 用户文件,只是设计用来方便测试和示例。
3、typedef.h 文件就是用户的h文件,要避免与其它用户h文件 类型重定义。
Matrix
发表于 2024-10-31 13:32:16
很好{:4_165:}{:4_165:}{:4_165:}{:4_165:}
hande5
发表于 2024-10-31 13:39:25
学习
CosyOS
发表于 2024-10-31 13:49:14
sdwys 发表于 2024-10-31 09:43
我测试了下,结果作者看看对不对。
编译时根据(group)的值只编译对应的一段代码,例如 group = s_u8_t...
你理解的差不多了,你的例子,最终结果是仅编译 *(s_u8_t*)&group ? true : false。
测试可采用 条件判断 或 赋值 等方法,
条件判断 更符合 实际应用。
u8 u8_1;
if(sTSV_QueryFlagGroup(u8_1)) _nop_();
这样测试经常还会导致更激进的优化,*(s_u8_t*)&u8_1 被优化为 u8_1。
如果换成标志组,就不会了,只能是 指针间接访问了。