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。
如果换成标志组,就不会了,只能是 指针间接访问了。
页: 84 85 86 87 88 89 90 91 92 93 [94] 95 96 97 98 99 100 101 102 103
查看完整版本: 全局不关总中断的 RTOS,CosyOS-III-V1.2.0, 送 擎天柱-AI8051U转89C52核心板