启动ucosii之七PC_SetTickRate(OS_TICKS_PER_SEC)

/*
uCOS-II定义频率,以改变钟节拍的速率.
在DOS下,每秒产生18.20648次时钟节拍,或每隔54.925ms一次.这是因为82C54定时器芯片没有初始化,而使用默认值65535的结果.
如果初始化为58659,那么时钟节拍的速率就会精确地为20.000Hz
*/
void PC_SetTickRate (INT16U freq)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif   
    INT16U     count;

//1.193Mhz/65536 ≈ 18.2HZ每秒18次中断
    if (freq == 18) {                            /* See if we need to restore the DOS frequency        */
        count = 0;
    } else if (freq > 0) {                       
                                                 /* Compute 8254 counts for desired frequency and ...  */
                                                 /* ... round to nearest count                         */

//设置计数count=1.193Mhz/f + 0.5
        count = (INT16U)(((INT32U)2386360L / freq + 1) >> 1);
    } else {
        count = 0;
    }
    OS_ENTER_CRITICAL();
//控制字设置为通道0; 先读低字节,再读高字节; mode3-方波信号发生器; 计数器使用二进制.
    outp(TICK_T0_8254_CWR,  TICK_T0_8254_CTR0_MODE3); /* Load the 8254 with desired frequency          */ 
    outp(TICK_T0_8254_CTR0, count & 0xFF);            /* Low  byte                                     */
    outp(TICK_T0_8254_CTR0, (count >> 8) & 0xFF);     /* High byte                                     */
    OS_EXIT_CRITICAL();
}

在使用 μC/OS-II 操作系统时,如果遇到 `OSTmr_Task` 定时器任务无法进入回调函数(callback function)的问题,可能涉及多个原因。以下是可能导致此问题的常见情况及对应的解决方案: ### 1. 定时器未正确创建或启动 确保调用 `OSTmrCreate()` 创建定时器时,参数设置正确,包括定时器周期、模式(单次或周期性)、以及回调函数指针。此外,必须调用 `OSTmrStart()` 启动定时器,否则即使定时器已创建,也不会开始计时[^1]。 ```c OS_TMR my_timer; BOOLEAN err; my_timer = OSTmrCreate(0, // 延迟初始时间(单位为时钟节拍) 100, // 周期时间(单位为时钟节拍) OS_TMR_OPT_PERIODIC,// 定时器选项:周期性 MyCallbackFunction, // 回调函数 (void *)0, // 传递给回调函数的参数 &err); // 错误状态 if (err == OS_ERR_NONE) { OSTmrStart(&my_timer, &err); // 启动定时器 } ``` ### 2. 回调函数格式不符合规范 μC/OS-II 的定时器回调函数必须遵循特定的原型定义,即: ```c void MyCallbackFunction(OS_TMR *ptmr, void *p_arg); ``` 其中 `ptmr` 是指向定时器结构体的指针,`p_arg` 是用户通过 `OSTmrCreate()` 传递的参数。若回调函数的签名不匹配,将导致无法正常调用[^1]。 ### 3. OSTmr_Task 优先级过低或被阻塞 μC/OS-II 的定时器服务由一个专用任务 `OSTmr_Task` 负责管理。该任务的优先级默认较低,若系统中存在高优先级任务长时间运行而未让出 CPU,可能导致 `OSTmr_Task` 无法及时执行回调函数。可考虑适当提高 `OSTmr_Task` 的优先级以确保其调度[^1]。 ```c // 在 os_cfg.h 中修改 OSTMR_TASK_PRIO 设置 #define OSTMR_TASK_PRIO 10 // 示例:将优先级设为 10 ``` ### 4. 系统时钟节拍中断配置错误 定时器依赖于 μC/OS-II 的时钟节拍中断(通常由 `OSTickISR()` 触发)。若时钟节拍中断未正确配置或未触发,则定时器无法递减计数,进而不会触发回调函数。应检查 `OS_TICKS_PER_SEC` 定义是否与实际的时钟节拍频率一致,并确认中断服务程序是否正常运行[^1]。 ### 5. 定时器对象未正确初始化 在某些移植版本中,需要手动调用 `OSTmrInit()` 初始化定时器模块。若未进行初始化,可能导致后续操作失败。应在应用程序初始化阶段调用该函数[^1]。 ```c OSTmrInit(); // 初始化定时器模块 ``` ### 6. 内存资源不足或分配失败 定时器对象的创建和管理需要占用一定的内存资源。若系统中内存池配置不足或动态内存分配失败,也可能导致定时器无法正常工作。可通过查看返回的错误码判断是否发生资源分配问题[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值