王锦平
发表于 2024-8-22 11:28:36
本帖最后由 王锦平 于 2024-8-22 12:07 编辑
楼主有没有什么readme文件配合阅读,看不懂你这个宏定义对应的都是什么参数
#define uCreateTask(task, pri, tss, srt, ntm) \
sCSV_CreateTask(task, pri, tss, srt, ntm, OS_NULL) /**[ \taskmsg\params (...) ]*//**< \taskcode {...} >*/
task 是任务这个看懂
pri 是任务优先级这个看懂
tss 是任务堆栈大小
其余的就看不懂了
希望楼主可以出一个readme文档,放在工程里头,供大家可以快速上手移植、告知主程序入口以及常用函数的使用,几天看下来已经动了三四个文件了,有些寄存器引用在我所用的这个stc8c的头文件里头是没有的,可以的话建议使用宏函数来修改寄存器的值,我认为能更好的移植,就不用编译的时候去修改未定义的寄存器,以下就是我修改的片段。一份一份文件找过去的时候略微麻烦
#define BIT_SET_ZERO(src, cnt) src &= ~(1 << cnt) // 给 src 左移 cnt位写0
#define BIT_SET_ONE(src, cnt) src |= (1 << cnt) // 给 src 左移 cnt 位写1
#define FIND_BIT(src, cnt) (src & (1 << cnt)) // 找 src 中左移 cnt 位的 1
/* INT0中断优先级为0级 */
#if TATGET_STC8H
IPH &=~PX0H;
#endif
BIT_SET_ZERO(IPH, 0);
PX0 = 0;除了修改了目标MCU以后能过编译,后面参考test里面的文件改后就不能过编译了{:4_241:}
王锦平
发表于 2024-8-22 12:55:44
本帖最后由 王锦平 于 2024-8-22 14:16 编辑
问,工程里面用了两个串口,UART1和UART2分别是用来做什么的。若是UART2是用来debug OS的那为什么不用UART1?打印字符串时前面加"OSdebug"这样的标签不就好了?
王锦平
发表于 2024-8-22 13:39:12
目前遇到了没有正常运行任务,望楼主能为我解惑
#include "os_link.h"
#include "stdio.h"
#define TEST_TASKSTACKSIZE 64
uCreateTask(task_2, 1, TEST_TASKSTACKSIZE, 0, 0)
{
static unsigned int i = 0;
//uDelay_s(5);
printf("task_2: %u\r\n", ++i);
uEndTasking;
}
int main(void)
{
void s_init_timing(void);
#if SYSCFG_SAFERUNTIME == __ENABLED__
s_tid_t i;
for(i = 0; i < OS_TASKTOTAL + 1; i++){
s_sign_timeout = 0;
}
#endif
#if OS_TIMINTTOTAL || OS_TIMQRYTOTAL
s_init_timing();
#endif
init_hook();
printf("init hook ok\r\n");
mSys_INIT;
printf("init syscfg ok\r\n");
#if SYSCFG_DEBUGGING == __ENABLED__
sStartTask_TimQry(OS_TMID_TASKMGR);
#endif
uStartTask(Starter, OS_STATUS_READY); // 启动任务
uStartTask(Sysidle, OS_STATUS_READY); // 空闲任务
uStartTask_Ready(task_2); // 启动用户任务
while(true);
}
打印的时候,只打印了main()里面的两句话,而任务里头的语句没有打印。即便是将空闲任务与用户任务交换位置,串口也是没有输出。我试过在 idle_hook 中放置打印也是没有任何输出,上电的时候,就两句话,以下是 log
init hook ok
init syscfg ok
init hook ok
init syscfg ok
ethantlh
发表于 2024-8-23 16:11:18
大佬好,我在编程过程中,遇到中断地址与PendSV中断地址冲突的问题。在程序中,所有含有可位寻址中断标志位的中断(INT0,TIMER0,INT1,TIMER1)都被我使用,剩下的中断都不能位寻址。图中清除标志位时需要使用汇编语言直接清除bit位,如果换成其他中断,就不能直接修改bit位,程序会报错。这个问题怎么解决?
王锦平
发表于 2024-8-23 22:06:51
ethantlh 发表于 2024-8-23 16:11
大佬好,我在编程过程中,遇到中断地址与PendSV中断地址冲突的问题。在程序中,所有含有可位寻址中断标志位 ...
C语言文件你插入汇编肯定是会报错的吧。你不能按位寻址,那就写个宏函数来操作中断地址中的某个 bit 啊,我都是这么解决的
#define BIT_SET_ZERO(src, cnt) src &= ~(1 << cnt) // 给 src 左移 cnt位写0
#define BIT_SET_ONE(src, cnt) src |= (1 << cnt) // 给 src 左移 cnt 位写1
#define FIND_BIT(src, cnt) (src & (1 << cnt)) // 找 src 中左移 cnt 位的 1
ethantlh
发表于 2024-8-28 18:17:53
请问,对于STC8H,putchar的重定向函数在哪里。我找了许久未找到,只看到stdio.h中有声明。我需要把printf调整到串口2上?其次,在5月20号的课程文档里面只有PPT没有工程。
CosyOS
发表于 2024-8-30 19:45:44
由于前段时间升级电脑,今日刚刚完工,
导致未能及时回复大家提出的问题,深表歉意!
接下来,我依次回复大家的问题。
CosyOS
发表于 2024-8-30 19:51:33
ethantlh 发表于 2024-8-28 18:17
请问,对于STC8H,putchar的重定向函数在哪里。我找了许久未找到,只看到stdio.h中有声明。我需要把printf ...
STC8H,putchar函数用的是标准库的,没有重定向。
你printf调整为其它串口,就自己重定向吧。
可以下载最新版的 工程模板,里面的 test 是目前最全面的示例。
CosyOS
发表于 2024-8-30 20:38:51
本帖最后由 CosyOS 于 2024-8-30 21:04 编辑
ethantlh 发表于 2024-8-23 16:11
大佬好,我在编程过程中,遇到中断地址与PendSV中断地址冲突的问题。在程序中,所有含有可位寻址中断标志位 ...
我给你个示例,PendSV 用 INT4 替换:
其中,EX4、INT4IF 是 宏定义的:
此时,本应 #define mPendSV_Clear为AUXINTIF &=~INT4IF,
但由于需用汇编,所以应该,#define mPendSV_Clear为ANL AUXINTIF, #0xBF,
但由于 宏定义中不能出现 #,
所以,可以 #define mPendSV_Clear 为空,或注释掉它,
而后在 port_8051s.s 中,直接把 mPendSV_Clear 替换为 ANL AUXINTIF, #0xBF。
mPendSV_Clear 的引用,仅此一处,暂时就用这个办法吧。
另外需注意,对于STC8,可能很多中断都无法用作 PendSV。
因为PendSV的替代中断需满足一个条件,
在关闭该中断的前提下,置中断标志位后再开启中断,得能响应中断。
判断方法,可以先用 INT0 做为 PendSV(一定能好用),待 任务能正常运行了,
再替换为其它中断,如果替换后任务不能运行,证明该中断不适用。
CosyOS
发表于 2024-8-30 21:17:29
本帖最后由 CosyOS 于 2024-8-30 21:19 编辑
王锦平 发表于 2024-8-22 13:39
目前遇到了没有正常运行任务,望楼主能为我解惑
打印的时候,只打印了main()里面的两句话,而任务里头的语 ...
启动你自己的任务,不要在 main()中,而是在 启动钩子 start_hook()中,
这样就会一切正常了。
你可以看一下test程序,都是这样的。
其实,设计理念就是 main()完全由OS管理,用户不要动它。