完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
核心芯片使用STM32F407
1、源码 网下载源码如下:各官主要在UCOS-II中的文件:在工程中创建三个分别的文件、源、配置(1)ports下IAR中的所有文件(2)源码中的所有(3)配置文件在官方官方文件中,只需要一个文件 2、文件修改 (1)修改os_cpu_a.asm具体表达,不了解,参考自点原子IMPORT OSRunning;外部参考 导入 OSPrioCur 导入 OSPrioHighRdy 进口OSTCBCur 导入 OSTCBHighRdy 导入 OSIntNesting 导入 OSIntExit 导入 OSTaskSwHook 导出 OSStartHighRdy 导出 OSCtxSw 导出 OSIntCtxSw 导出 OS_CPU_SR_Save ; 在此文件中声明的函数 EXPORT OS_CPU_SR_Restore 导出 PendSV_Handler NVIC_INT_CTRL EQU 0xE000ED04 ; 取消控制 NVIC_SYSPRI2 EQU 0xE000ED22 ; 系统优先级缓存(2) NVIC_PENDSV_PRI EQU 0xFFFF ; PendSV中断和系统节拍中断 ; (都为最低,0xff)。 NVIC_PENDSVSET EQU 0x10000000 ; 触发软件中断的值。 保留8 区域 |.text|,代码,只读 拇指 OS_CPU_SR_Save MRS R0, PRIMASK ;读取PRIMASK到R0,R0为返回值 CPSID I ;PRIMASK=1,关闭中断(NMI和硬件FAULT可以响应) BX LR ;返回 OS_CPU_SR_Restore MSR PRIMASK, R0 ;读取R0到PRIMASK中,R0为参数 BX LR ;返回 ;* 功能描述: 使用调度器运行第一个任务 OSStartHighRdy LDR R4,=NVIC_SYSPRI2;设置 PendSV 异常优先级 LDR R5, =NVIC_PENDSV_PRI STR R5, [R4] MOV R4, #0 ; 将 PSP 设置为 0 以进行初始上下文切换调用 MSR PSP, R4 LDR R4, = OSRunning ; 操作系统运行 = TRUE MOV R5,#1 STRB R5, [R4] ;切换到最高优先级的任务 LDR R4, =NVIC_INT_CTRL ;触发 PendSV 异常(导致上下文切换) LDR R5, =NVIC_PENDSVSET STR R5, [R4] CPSIE I ;在处理器级别启用中断 操作系统启动挂起 B OSStartHang ;不应该到达这里 ;* 功能描述: 任务级上下文切换 OSCtxSw 推{R4,R5} LDR R4, =NVIC_INT_CTRL ;触发PendSV异常(导致上下文切换) LDR R5, =NVIC_PENDSVSET STR R5, [R4] POP {R4, R5} BX LR ;* 功能描述:中断级任务切换 OSIntCtxSw 推{R4,R5} LDR R4, =NVIC_INT_CTRL;触发PendSV异常(导致上下文切换) LDR R5, =NVIC_PENDSVSET STR R5, [R4] POP {R4, R5} BX LR 空运 ;* 功能描述:OSPendSV 用于引起上下文切换。 PendSV_Handler CPSID I ; 在上下文切换期间防止中断 MRS R0,PSP;PSP是栈指针在用P指针,则可以忽略PS过程,参考CM3权威中的双指针 CBZ R0,PendSV_Handler_Nosave ;第一次跳过注册保存 TST R14,#0x10 IT EQ VSTMDBEQ R0!,{S16-S31} 订阅 R0, R0, #0x20 ; 将剩余的 regs r4-11 保存在进程堆栈上 STM R0,{R4-R11} LDR R1, =OSTCBCur ; OSTCBCur->OSTCBStkPtr = SP; LDR R1, [R1] STR R0, [R1] ; R0 是被切换进程的 SP PendSV_Handler_Nosave 推{R14}; 保存 LR exc_return 值 LDR R0, =OSTaskSwHook ; OSTaskSwHook(); BLX R0 流行音乐{R14} LDR R0, = OSPrioCur ; OSPrioCur = OSPrioHighRdy; LDR R1, = OSPrioHighRdy LDRB R2, [R1] STRB R2, [R0] LDR R0, =OSTCBCur ; OSTCBCur = OSTCBHighRdy; LDR R1, = OSTCBHighRdy LDR R2, [R1] STR R2, [R0] LDR R0, [R2] ; R0为新进程SP;SP = OSTCBHighRdy->OSTCBStkPtr; LDM R0, {R4-R11} ; 从新进程堆栈恢复 r4-11 地址 R0, R0, #0x20 ;任务是否使用 FPU 上下文?如果是这样,推高 vfp 寄存器。 TST R14,#0x10 IT EQ VLDMIAEQ R0!, {S16-S31} MSR PSP, R0 ; 用新进程 SP 加载 PSP ORR LR,LR,#0x04;确保异常返回使用进程堆栈 CPSIE I BX LR ; 异常返回将恢复剩余的上下文 空运 结尾 (2)修改os_cfg.h #define OS_APP_HOOKS_EN 设置为0 (3)修改os_cpu_c.c 0)这个文件中的函数基本都空函数,其中OSTaskStkInit()函数是最重要的,其他功能如果屏蔽掉掉识别 1 )修改OSTaskStkInit(),函数是这个函数,参考自正点原子,中间没有执行部分不知道,所以不能屏蔽掉(死机) OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt) { OS_STK *stk; (无效)选择; stk = pts; #if (__FPU_PRESENT==1)&&(__FPU_USED==1) *(--stk) = (INT32U)0x00000000L;//没有名字注册 *(--stk) = (INT32U)0x00001000L; //FPSCR *(--stk) = (INT32U)0x00000015L; //s15 *(--stk) = (INT32U)0x00000014L;// s14 *(--stk) = (INT32U)0x00000013L;//s13 *(--stk) = (INT32U)0x00000012L;//s12 *(--stk) = (INT32U)0x00000011L;//s11 *(--stk) = (INT32U)0x00000010L; //s10 *(--stk) = (INT32U)0x00000009L;//s9 *(--stk) = (INT32U)0x00000008L;//s8 *(--stk) = (INT32U)0x00000007L;//s7 *(--stk) = (INT32U)0x00000006L;//s6 *(--stk) = (INT32U)0x00000005L;//s5 *(--stk) = (INT32U)0x00000004L;//s4 *(--stk) = (INT32U)0x00000003L;//s3 *(--stk) = (INT32U)0x00000002L;//s2 *(--stk) = (INT32U)0x00000001L; //s1 *(--stk) = (INT32U)0x00000000L;//s0 #万一 *(stk) = (INT32U)0x01000000L;/* xPSR */ *(--stk) = (INT32U)任务;/* 入口点 */ *(--stk) = (INT32U)OS_TaskReturn; /* R14 (LR)(如果使用过初始化值会导致错误)*/ *(--stk) = (INT32U)0x12121212L;/* R12 */ *(--stk) = (INT32U)0x03030303L;/* R3 */ *(--stk) = (INT32U)0x02020202L;/* R2 */ *(--stk) = (INT32U)0x01010101L; /* R1 */ *(--stk) = (INT32U)p_arg; /* R0 : 参数 */ #if (__FPU_PRESENT==1)&&(__FPU_USED==1) *(--stk) = (INT32U)0x00000031L;//s31 *(--stk) = (INT32U)0x00000030L;//s30 *(--stk) = (INT32U)0x00000029L; //s29 *(--stk) = (INT32U)0x00000028L; //s28 *(--stk) = (INT32U)0x00000027L; //s27 *(--stk) = (INT32U)0x00000026L; //s26 *(--stk) = (INT32U)0x00000025L;// s25 *(--stk) = (INT32U)0x00000024L;//s24 *(--stk) = (INT32U)0x00000023L; //s23 *(--stk) = (INT32U)0x00000022L; //s22 *(--stk) = (INT32U)0x00000021L;//s21 *(--stk) = (INT32U)0x00000020L;//s20 *(--stk) = (INT32U)0x00000019L; //s19 *(--stk) = (INT32U)0x00000018L; //s18 *(--stk) = (INT32U)0x00000017L;//s17 *(--stk) = (INT32U)0x00000016L; //s16 #万一 *(--stk) = (INT32U)0x11111111L;/* R11 */ *(--stk) = (INT32U)0x10101010L;/* R10 */ *(--stk) = (INT32U)0x09090909L; /* R9 */ *(--stk) = (INT32U)0x08080808L; /* R8 */ *(--stk) = (INT32U)0x07070707L;/* R7 */ *(--stk) = (INT32U)0x06060606L;/* R6 */ *(--stk) = (INT32U)0x05050505L;/* R5 */ *(--stk) = (INT32U)0x04040404L;/* R4 */ 返回(stk); } 2)将OS_CPU_SysTickInit()和OS_CPU_SysTickHandler()这两个功能屏蔽,改为自写的滴答定时器初始化以及中断处理 #include "stm32f4xx.h" #include "ucos_ii.h" //设置任务优先级 #define START_TASK_PRIO 10 //开始任务的优先级设置为最低 //设置任务发出大小 #define START_STK_SIZE 64 //观察任务 OS_STK START_TASK_STK[START_STK_SIZE]; //任务函数 void start_task(void *pdata); int main(void) { 操作系统初始化(); OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO);//创建任务任务 操作系统启动(); } //开始任务 void start_task(void *pdata) { SysLED_Init(); SysTick_init(); USART_Config(); printf("初始化完成rn"); 同时(1) { OSTimeDly(500); SysLed(); OSTimeDly(500); SysLed(); } } (4)os_dbg.c中#define OS_COMPILER_OPT //__root (6)ucos_ii.h中添加#include “stm32f4xx.h”,这个重要比较,也没有导致程序死机 3、主函数 #include "stm32f4xx.h" #include "ucos_ii.h" //设置任务优先级 #define START_TASK_PRIO 10 //开始任务的优先级设置为最低 //设置任务发出大小 #define START_STK_SIZE 64 //观察任务 OS_STK START_TASK_STK[START_STK_SIZE]; //任务函数 void start_task(void *pdata); int main(void) { 操作系统初始化(); OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO);//创建任务任务 操作系统启动(); } //开始任务 void start_task(void *pdata) { SysLED_Init(); SysTick_init(); USART_Config(); printf("初始化完成rn"); 同时(1) { OSTimeDly(500); SysLed(); OSTimeDly(500); SysLed(); } } 注:文中参考或自写部分均采用说明,其他代码通用源码, |
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1641 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1562 浏览 1 评论
988 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
691 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1608 浏览 2 评论
1869浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
655浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
525浏览 3评论
540浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
512浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 02:11 , Processed in 1.039987 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号