core_cm3文件函数一览
1 |
#define OS_ENTER_CRITICAL()
__asm( "CPSID I") #define OS_EXIT_CRITICAL() __asm( "CPSIE I") |
1 |
__asm
{ //原汁原味的汇编语句 } |
不用,编译器帮我们做了。
1 |
__asm uint32_t __get_PSP(
void) { mrs r0, psp bx lr } |
bx lr显式返回,我之前就忘了返回,然后就HardFault_Handler了。
1 |
/* define compiler specific symbols */
#if defined ( __CC_ARM ) #define __ASM __asm /*!< asm keyword for ARM Compiler */ #define __INLINE __inline /*!< inline keyword for ARM Compiler */ #elif defined ( __ICCARM__ ) #elif defined ( __GNUC__ ) #elif defined ( __TASKING__ ) #endif |
TASKING Compiler
(
Embedded software development tools
)?
1 |
/* ################### Compiler specific Intrinsics ########################### */ #if defined ( __CC_ARM ) #elif (defined (__ICCARM__)) #elif (defined (__GNUC__)) #elif (defined (__TASKING__)) /* #endif |
/* ARM armcc specific functions */讨论下。
1 |
/**
* @brief Return the Process Stack Pointer * * @return ProcessStackPointer * * Return the actual process stack pointer */ __ASM uint32_t __get_PSP( void) { mrs r0, psp bx lr } /** |
OSStartHighRdy
1 |
;定义几个常量,类似C语言中的#define预处理指令。
NVIC_INT_CTRL EQU 0xE000ED04 ; 中断控制寄存器 NVIC_SYSPRI14 EQU 0xE000ED22 ; PendSV优先级寄存器的地址 NVIC_PENDSV_PRI EQU 0x000000FF ; PendSV中断的优先级为255(最低) NVIC_PENDSVSET EQU 0x10000000 ; 触发软件中断的值,位28为1. ;******************************************************************************************************** ; START MULTITASKING ; void OSStartHighRdy( void) ; ; Note(s) : ) This function triggers a PendSV exception (essentially, causes a context switch) to cause ; the first task to start. ; ; ) OSStartHighRdy() MUST: ; a) Setup PendSV exception priority to lowest; ; b) Set initial PSP to , to tell context switcher this is first run; ; c) Set the main stack to OSRunning ; d) Trigger PendSV exception; ; e) Enable interrupts (tasks will run with interrupts enabled). ;******************************************************************************************************** OSStartHighRdy ;设置PendSV中断的优先级 LDR R4, =NVIC_SYSPRI14 ; set the PendSV exception priority LDR R5, =NVIC_PENDSV_PRI STR R5, [R4] ;设置PSP为0 MOV R4, #0 ; set the PSP to for initial context switch call MSR PSP, R4 ;设置OSRunning为TRUE LDR R4, =OSRunning ; OSRunning = TRUE MOV R5, #1 STRB R5, [R4] ;触发PendSV中断 CPSIE I ;enable interrupts at processor level |
省掉第一次上下文切换时候的R4-R11的入栈保护,仅此而已,这是事实没错,但是这个考虑会增加代码的编写,体现在此处和PendSV中断函数的编写上,不过这也表明作者的多OS过程的认识,思维的严谨。关于第5点,显示声明中断要开着,没有也没关系,因为本来中断就是开着的,只要你不蛋疼的去把它关掉。
1 |
#define NVIC_INT_CTRL *((OS_CPU_SR *)0xE000ED04)
//中断控制寄存器ICSR #define NVIC_PENDSVSET 0x10000000 //触发软件中断的值,位28为1. #define OS_TASK_SW() NVIC_INT_CTRL = NVIC_PENDSVSET #define OSIntCtxSw() NVIC_INT_CTRL = NVIC_PENDSVSET #define OS_ENTER_CRITICAL() #define NVIC_SYSPRI14 *((OS_CPU_SR *)0xE000ED22) void OSStartHighRdy( |
放在os_cpu_c.c文件中,当然一般的宏定义还是会放在头文件oc_cpu.h中的。
PSP,这也是我之前没注意的地方,
扯远了,看下一个:
1 |
/**
* @brief Return the Main Stack Pointer * * @return Main Stack Pointer * * Return the current value of the MSP (main stack pointer) * Cortex processor register */ __ASM uint32_t __get_MSP( void) { mrs r0, msp bx lr } /** |
1 |
/**
* @brief Reverse byte order in unsigned short value * * @param value value to reverse * @return reversed value * * Reverse byte order in unsigned short value */ __ASM uint32_t __REV16(uint16_t value) { rev16 r0, r0 bx lr } /** |
1 |
/**
* @brief Remove the exclusive lock created by ldrex * * Removes the exclusive lock which is created by ldrex. */ __ASM void __CLREX( void) { clrex } /** /** /** /** /** /** /** /** |
core_cm3文件函数一览的更多相关文章
- PHP写文件函数
/** * 写文件函数 * * @param string $filename 文件名 * @param string $text 要写入的文本字符串 * @param string $openmod ...
- PHP输出XML文件函数
PHP输出XML文件函数 function xml_out($content, $charset = 'utf-8') { @header("Expires: -1"); @hea ...
- PHP多重判断删除文件函数
<?function delete_file($file) { if (file_exists($file)) { $delete = chmod ($file, ...
- PHP常用文件函数和目录函数整理
一.常用文件函数库 1.basename(); -- 返回路径中的文件名部分. string basename ( string $path [, string $suffix ] ) //给出一个包 ...
- BCB/Delphi中常用的VCL函数说明(文件函数)
--------------------文件操作--------------------函数名称:ChangeFileExt函数说明:更改指定文件的扩展名,函数原型如下:AnsiString __fa ...
- 通过ajax前端后台交互/登录页和注册页前端后台交互详解/前端后台交互基础应用/几个后台函数的基础应用/php文件函数基础应用/php字符传函数基础应用/php数组函数基础应用
前 言 PHP 学习了好久的PHP,今天做一个可以后台交互的登录页和注册页,没做什么判断,简单的了解一下. 具体的内容分析如下: ① PHP中的数据传输-->>由注册页传输 ...
- PHP 文件锁和常用文件函数
文件锁 bool flock ( int handle, int operation [, int &wouldblock] );flock() 操作的 handle 必须是一个已经打开的文件 ...
- php总结7——文件函数库、序列化数据、文件包含
7.1 文件函数库 php用来操作文件的 1) fopen 代开文件或URL 格式:resource fopen(string $filename, string $mode) 'r' 只读方式 ...
- PHP文件函数
PHP文件函数 函数 描述 PHPbasename() 返回路径中的文件名部分. 3chgrp() 改变文件组. 3chmod() 改变文件模式. 3chown() 改变文件所有者. 3clearst ...
随机推荐
- Swift之高德地图自定义标注弹出气泡样式
在用到地图类的sdk,sdk自带的样式必定不能满足开发者的需求,于是开发者不得不进行自定义,由于官方同样是object-c 版语法,不得不将其转为swift语法,以满足项目需求. 新建两个类 Cust ...
- Java static块
首先,我们看一个实际例子: class Test{ public static int X=100; public final static int Y=200; public Test(){ Sys ...
- 学习OkHttp wiki--Interceptors
Interceptors 拦截器(Interceptors)是一种强有力的途径,来监控,改写和重试HTTP访问.下面是一个简单的拦截器,对流出的请求和流入的响应记录日志. class LoggingI ...
- Geodatabase - 打开栅格数据
打开栅格数据 和打开要素类的方式类似,打开栅格数据集需要用 IRasterWorkspace,如 //获得栅格工作空间(普通目录). public ESRI.ArcGIS.DataSourcesRas ...
- ORA-02095: specified initialization parameter cannot be modified
输入命令:alter system set utl_file_dir='/home/oracle/logmnr' scope=spfile; 报错: 出错原因:没有用spfile文件启动数据库 解决办 ...
- mysql数据修改-DEDE
update `dede_arctype` set `templist`='{style}/products.htm' where `templist`='{style}/Product.htm' d ...
- 解决IE10以下对象不支持“bind”属性或方法
IE10一下的浏览器,如果在JS代码中用了bind函数,那么就会报“SCRIPT438: 对象不支持“bind”属性或方法” 因为浏览器没有提供这个参数的方法,所以我们就自己写一个bind,来让这个参 ...
- CSS/CSS3长度、时间、频率、角度单位大全
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=1494 一.一笔带过的 ...
- Python入门-----介绍
摘要:Python语言的特点 ----->优雅.明确.简单 一.Python适合的领域 web网站和各种网络服务 系统工具和脚本 作为“胶水”语言,把其他语言开发的模块包装起来方便使用 二.Py ...
- Python函数小结(1)--参数类型(*, ** 的区别), 闭包
刚开始学习python,python相对于java确实要简洁易用得多.内存回收类似hotspot的可达性分析, 不可变对象也如同java得Integer类型,with函数类似新版本C++的特性,总体来 ...