永发信息网

uC/OS II移植到ARM,其中,OSTickISR()函数的汇编代码

答案:2  悬赏:40  手机版
解决时间 2021-01-26 18:49
  • 提问者网友:爱了却不能说
  • 2021-01-25 18:44
uC/OS II移植到ARM,其中,OSTickISR()函数的汇编代码
最佳答案
  • 五星知识达人网友:笑迎怀羞
  • 2021-01-25 20:12
OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
{
OS_STK *stk;
INT32U task_addr;

opt = opt;
stk = ptos;
task_addr = (INT32U)task & ~1;
*(stk) = (INT32U)task_addr;
*(--stk) = (INT32U)0x14141414L;
*(--stk) = (INT32U)0x12121212L;
*(--stk) = (INT32U)0x11111111L;
*(--stk) = (INT32U)0x10101010L;
*(--stk) = (INT32U)0x09090909L;
*(--stk) = (INT32U)0x08080808L;
*(--stk) = (INT32U)0x07070707L;
*(--stk) = (INT32U)0x06060606L;
*(--stk) = (INT32U)0x05050505L;
*(--stk) = (INT32U)0x04040404L;
*(--stk) = (INT32U)0x03030303L;
*(--stk) = (INT32U)0x02020202L;
*(--stk) = (INT32U)0x01010101L;
*(--stk) = (INT32U)p_arg;
if ((INT32U)task & 0x01) {
*(--stk) = (INT32U)ARM_SVC_MODE_THUMB;
} else {
*(--stk) = (INT32U)ARM_SVC_MODE_ARM;
}
return (stk);
}

我也刚开始学,这是从一个移植成功的例子中摘下来的 ,堆栈的增长方向是向上增长的!
全部回答
  • 1楼网友:蓝房子
  • 2021-01-25 21:34
内核结构:临界段、任务、任务状态、任务控制块(os-tcb)、就绪表、任务调度、给调度器上锁和开锁、空闲任务(idle task)、统计任务、中断处理、时钟节拍、ucos2初始化和启动。 void task1(void) { int32u count=0; start_tick(); while(1) { printf("count;",count++); ostimedly(25); } } void task2(void) { int32u count=0; ticker_init(os_ticks_per_sec); while(1) { printf("count;",count++); ostimedly(50); } } void main() { sysinit(); osinit(); ostaskcreat(task1,(void*)&task1data, (void*)&task1stk[task_stk_size],task1prio); ostaskcreat(task2) osstart(); } 例子中的ucos系统中有3个任务。task1和task2仅仅是进行延时、研时不同的时间片、代码如图示。另一个是空闲任务,是ucos启动时自动创建的。 ucos运行开始于main函数,代码如图。main函数首先调用sysinit(),该函数不是操作系统本身具有的,是一个自行编写的函数,用来做一些针对具体系统的初始化工作,这个函数不是必须的。 osinit,这个函数是ucos的系统函数,是ucos启动时必须调用的。它主要是用来对ucos内核中的各种数据结构做初始化工作。(同样是int,在有的cpu体系结构中是16bit,在有的cpu体系结构中是32bit)此外它还会建立空闲任务idle task,这个任务总是处于就绪态,优先级总是设为最低,这个任务从代码角度讲只是对一个全局变量osidlectr做累加,它的作用是在系统空闲时消耗cpu时间。如果统计任务允许os-task-stat-en和任务建立扩展允许都设为1,则osinit()还得建立统计任务ostaskstat()并且让其进入就绪态,优先级总是设为os-lowest-prio-1。 接下来,2次调用ostaskcreat(),创建2个任务:task1和task2。从代码中我们看到有2个变量:task1stk和task2stk,分别为2个任务的堆栈,这个在前面提到过,ucos的堆栈大小是可以根据需要定制的,从代码的角度讲,任务的堆栈是以全局数组的形式来实现的。调用ostaskcreat()时还有2个参数:task1prio和task2prio,它们表示的是任务的优先级,在例子中task2的任务优先级高于task1。需要注意,在main函数中至少要建立一个任务,否则ucos无法正常进行。 最后main()函数调用osstart(),这个函数做的工作是从任务就绪表中找到优先级最高的任务的任务控制块,之后,osstart()调用高优先级就绪任务启动函数osstarthighrdy(),这个函数与选择的微处理器有关,它是在针对具体平台进行移植时自行编写的。osstarthighrdy()使已经创建的任务中优先级最高的任务开始运行,之后程序是不会返回osstart()的,本例子中task2首先开始执行。 再返回到程序清单,可以看到task2于task1相比唯一的不同就是task2执行的第一个语句是调用函数ticker——init(),这是个自行编写的函数,作用是设置定时器,从而为操作系统运行提供时钟节拍。之所以这样是由于ucos的结构造成的,ucos要求在osstart()运行后才能打开定时器中断。如果不这样做的话,时钟节拍中断有可能在ucos启动第一个任务之前发生,此时ucos处于不确定状态之中,程序有可能崩溃。 之后,ucos就开始了运转,对于例子来说就是task1和task2以及空闲任务轮番工作。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯