STM32F103C8T6 移植 μC/OS-ii Keil(二)

2024-03-20 20:48
文章标签 移植 ii keil os stm32f103c8t6

本文主要是介绍STM32F103C8T6 移植 μC/OS-ii Keil(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一篇我代码的一些复制粘贴,下面就需要进入到工程里面去更改一些东西。

启动文件:startup_stm32f10x_md.s找到下面的函数,更改

 更改为:

 相应的这个文件下面还有,需要更改:

PendSV_Handler  PROCEXPORT  PendSV_Handler             [WEAK]B       .ENDP
SysTick_Handler PROCEXPORT  SysTick_Handler            [WEAK]B       .ENDP

改为: 

OS_CPU_PendSVHandler  PROCEXPORT  OS_CPU_PendSVHandler             [WEAK]B       .ENDP
OS_CPU_SysTickHandler PROCEXPORT  OS_CPU_SysTickHandler            [WEAK]B       .ENDP

这个是要把原来的STM32的跳转和时钟中断处理更改成操作系统的函数,对应的要把下面的函数的定义改变:

函数的定义在这个文件里面stm32f10x_it.c :

找到

把原来系统的Pend_Handler可以保存或者注释,因为这个其实已经没有用了,相应的跳转函数OS_CPU_PendSVHandler在UCOS的源代码中有(可能我不知道在哪里),但是这个SysTick_Handler需要改成OS_CPU_SysTickHandler,然后还需要编写函数体:

void SysTick_Handler(void)
{                   OSIntEnter();        OSTimeTick();       OSIntExit();       
}

以上就相当于是可以了的,已经一直完成了,编译之后你可能会出现问题。是因为有些功能你没用的,并不需要,只消找到配置文件将配置改成0就可以。

我遇到的一些问题:

1.头文件的引入错误

include.h文件中,取消掉#include没有的文件比如  #include<bsp.h>

还有://#include  <stm32f10x_lib.h>
#include  <stm32f10x.h>把上面那个更改成下面这个,这个只是因为我是用的是全新的外设库,上面那个是以前版本的外设库的名字。

现在可以编译了,会发现有很多的错误, 我列举一些我出现过的编译错误:

.\Objects\STM32.axf: Error: L6218E: Undefined symbol App_TaskDelHook (referred from os_cpu_c.o).等

这个是因为我们没有复制粘贴app相关的代码,所以我们没有用这个,找到os_cfg.h中的OS_APP_HOOKS_EN   ,把后面的那个1改成0, 我们不使能它。

还有找一下 OS_DEBUG_EN 也不使能,设为0;

  #20:identifier "OS_TASK_TMR_PRIO" is undefined

意思是,OS_TASK_TMR_PRIO未定义,因为暂时用不到,先关了,前往os_cfg.h找到以下语句,设为0

#define OS_TMR_EN       0    

差不多了,编译不报错的话,就可以修改主函数了

#include "stm32f10x.h"
#include "ucos_ii.h"
#include "os_cpu.h"void LED_Init(void);
void Task_LED(void *p);
void OSTick_Init(void);
void Task_LED2(void *p);//设置任务优先级
#define LED_TASK_PRIO			6
#define LED2_TASK_PRIO			5
//前面有4个任务的优先级是固定的,用户不能使用。//设置任务堆栈大小
#define LED_STK_SIZE			64//任务堆栈
OS_STK LED_TASK_STK[LED_STK_SIZE];OS_STK LED2_TASK_STK[LED_STK_SIZE];int main()
{//LED灯的初始化LED_Init();	//系统初始化OSInit();//初始化系统时钟SysTick_Config(SystemCoreClock /1000);//新建任务LED1OSTaskCreate(Task_LED,(void *) 0,(OS_STK *)&LED_TASK_STK[LED_STK_SIZE-1],(u8)LED_TASK_PRIO);//新建任务LED2OSTaskCreate(Task_LED2,(void *) 0,(OS_STK *)&LED2_TASK_STK[LED_STK_SIZE-1],(u8)LED2_TASK_PRIO);//启动OSStart();return 0;
}
void OSTick_Init(void)
{}
void Task_LED(void *p)
{p = p;while(1){	GPIO_SetBits(GPIOB,GPIO_Pin_6);OSTimeDly(100);GPIO_ResetBits(GPIOB,GPIO_Pin_6);OSTimeDly(100);}
}
void Task_LED2(void *p)
{p = p;while(1){	GPIO_SetBits(GPIOB,GPIO_Pin_7);OSTimeDly(500);GPIO_ResetBits(GPIOB,GPIO_Pin_7);OSTimeDly(500);}
}
void LED_Init()
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);/* Configure PD0 and PD2 in output pushpull mode */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);			 }

创建了两个LED任务,不同的时间闪烁,连接线路然后编译下载试一下吧!

两个灯会交替的闪烁,因为周期不一样。如果正常说明前面修改的OS_Pend_SVHandler和OS_SysTickHandler都是没有问题的。

这篇关于STM32F103C8T6 移植 μC/OS-ii Keil(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/830684

相关文章

MCU7.keil中build产生的hex文件解读

1.hex文件大致解读 闲来无事,查看了MCU6.用keil新建项目的hex文件 用FlexHex打开 给我的第一印象是:经过软件的解释之后,发现这些数据排列地十分整齐 :02000F0080FE71:03000000020003F8:0C000300787FE4F6D8FD75810702000F3D:00000001FF 把解释后的数据当作十六进制来观察 1.每一行数据

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

从0到1,AI我来了- (7)AI应用-ComfyUI-II(进阶)

上篇comfyUI 入门 ,了解了TA是个啥,这篇,我们通过ComfyUI 及其相关Lora 模型,生成一些更惊艳的图片。这篇主要了解这些内容:         1、哪里获取模型?         2、实践如何画一个美女?         3、附录:               1)相关SD(稳定扩散模型的组成部分)               2)模型放置目录(重要)

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

LeetCode:3177. 求出最长好子序列 II 哈希表+动态规划实现n*k时间复杂度

3177. 求出最长好子序列 II 题目链接 题目描述 给你一个整数数组 nums 和一个非负整数k 。如果一个整数序列 seq 满足在下标范围 [0, seq.length - 2] 中 最多只有 k 个下标i满足 seq[i] != seq[i + 1] ,那么我们称这个整数序列为好序列。请你返回 nums中好子序列的最长长度。 实例1: 输入:nums = [1,2,1,1,3],

代码训练营 Day26 | 47.排序II | 51. N-皇后 |

47.排序II 1.跟46题一样只不过加一个树层去重 class Solution(object):def backtracking(self,nums,path,result,used):# recursion stopif len(path) == len(nums):# collect our setresult.append(path[:])return for i in range(

Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.B

一个bug日志 FATAL EXCEPTION: main03-25 14:24:07.724: E/AndroidRuntime(4135): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.syyx.jingubang.ky/com.anguotech.android.activity.Init

代码随想录训练营day37|52. 携带研究材料,518.零钱兑换II,377. 组合总和 Ⅳ,70. 爬楼梯

52. 携带研究材料 这是一个完全背包问题,就是每个物品可以无限放。 在一维滚动数组的时候规定了遍历顺序是要从后往前的,就是因为不能多次放物体。 所以这里能多次放物体只需要把遍历顺序改改就好了 # include<iostream># include<vector>using namespace std;int main(){int n,m;cin>>n>>m;std::vector<i

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II 1.题目 1.1递增子序列 题目链接:491. 非递减子序列 - 力扣(LeetCode) 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0491.%E9%80%92%E