📄 readme.c
字号:
/********************************************************************************************
----------------------------------UCOSII学习笔记---------------------------------------------
2008年4月9日:
使用ZLG提供的在KEIL下的UCOSII模板文件。
在 项目设置页面内 的 asm 选项卡 中选择 no warning 后,依然存在两个告警,但是这两个告警不影响程序运行。
具体原因未知。
如果添加自己的中断处理函数,注意以下几点:
1、target.c文件中需要在VICInit函数中 添加 中断初始化信息
2、target.c内TargetInit函数中 添加 中断程序 初始化信息
3、IRQ.s文件末 添加 中断句柄,目的是发生中断后能够找到对应的中断处理函数来处理
4、中断服务程序的命名和写法都发生变化。
以I2C为例
void I2c_Exception(void)
{
OS_ENTER_CRITICAL();
----------
VICVectAddr = 0; // 通知中断控制器中断结束
OS_EXIT_CRITICAL();
}
4.1、I2c_Exception名字之所以是这样,是因为在IRQ.s文件中句柄定义的时候是定义成这样的。
如果这里修改,那么IRQ.s文件中也需要修改。
4.2、中断程序内处理需要一条通知中断控制器中断结束的语句之外,还需要进入临界区和退出临界区代码。
2008年4月9日15:36:40:
I2C0读写EEPROM代码添加完毕。
ZLG提供的UCOSII下的IIC驱动程序不能指定子地址读写。
经过修改之前提供的IIC接口函数,完成了UCOSII下的移植。
手机号13510773588:
UART0驱动代码修改。
实际使用发现有问题。不能直接使用。具体在UART0Getch函数。
原函数如下:
uint8 UART0Getch(void)
{
uint8 err;
OS_ENTER_CRITICAL();
while ((U0LSR & 0x00000001) == 0)
{ // 没有收到数据
U0IER = U0IER | 0x01; // 允许接收中断
OSSemPend(Uart0Sem, 0, &err); // 等待接收数据
}
err = U0RBR; // 读取收到的数据
OS_EXIT_CRITICAL();
return err;
}
由于配套的UART0例程只有一个任务,所以,看不出有什么问题。
但是,一旦两个任务同时运行,问题就来了。
具体分析如下:
由于该函数进去后就 进入临界段代码区。所以,运行OSSemPend后,程序进入等待状态,由于进入了临界区
所以,程序等待后 内核不会 调度 其他高优先级的任务运行。
从而导致程序在这里死等。
为了解决该问题,修改了该函数。
uint8 UART0Getch(void)
{
uint8 err;
while ((U0LSR & 0x00000001) == 0)
{ // 没有收到数据
U0IER = U0IER | 0x01; // 允许接收中断
OSSemPend(Uart0Sem, 0, &err); // 等待接收数据
}
OS_ENTER_CRITICAL();
err = U0RBR; // 读取收到的数据
OS_EXIT_CRITICAL();
return err;
}
仅仅将 OS_ENTER_CRITICAL()函数换个地方即可。
2008年4月10日17:12:50:
INT8U OSMboxPost (OS_EVENT *pevent, void *msg)
发送邮箱消息后,会将 msg 指针传递给 邮箱 pevent 结构体内的一个 指针
通过
void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
可以将该指针做为返回值弹出
但是要注意类型转换。
*********************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -