FreeRTOS例程2-任务挂起恢复与使用中断遇到的坑!
任务挂起简单点理解就是现在不需要执行这个任务,让它先暂停,就是挂起。恢复就是从刚才挂起的状态下继续运行。
API函数任务挂起vTaskSuspend()函数原型(tasks.c中):
1void vTaskSuspend( TaskHandle_t xTaskToSuspend )
参数:
xTaskToSuspend:需要挂起的任务句柄
任务恢复vTaskResume()函数原型(tasks.c中):
1void vTaskResume( TaskHandle_t xTaskToResume )
参数:
xTaskToSuspend:需要恢复的任务句柄
中断函数中进行任务恢复xTaskResumeFromISR()1BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume )
参数:
xTaskToSuspend:需要挂起的任务句柄
总结:
这几个函数用起来还是很简单的,只需要传入任务的句柄即可。
注意,任务挂起是没有FromISR版本的,所以在中断中貌似就不可以使用任务挂起了。
程序验证在上个例程的基础 ...
FreeRTOS例程1-基础任务创建
API函数任务创建 xTaskCreate()
函数原型(tasks.c中):
123456BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint16_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask )
参数:
pxTaskCode:自己创建的任务函数的函数名
pcName:任务的名字,随意起,字符串型
usStackDepth:任务堆栈大小(实际上申请到的是这里的4倍),设的太小任务可能无法运行!
pvParameters:任务函数的参数,不需要传参设为NULL即可
uxPriority ...
FreeRTOS介绍与源码结构分析
FreeRTOS简介FreeRTOS,全称Free Real Time Operating System,即免费的实时操作系统。相比于计算机中用到的Windows,MacOS,Linux等操作系统,实时操作系统(RTOS)是一种轻量级的操作系统,适用于嵌入式硬件中,用于解决单片机类裸机轮询方式在处理多个任务时的实时性不高的问题。
目前的实时操作系统有好多种,除FreeRTOS外,还有μCOS、RT-Thread、RTX、Alios Things、Huawei LiteOS等。
什么是RTOS?实时操作系统(RTOS)的主要特点是可以实现多任务,与多任务系统相对的是裸机系统。
裸机系统裸机系统就是最初我们学习单片机编程时接触的那种编程方式,main函数中一个while大循环依次处理各个模块的任务,对于需要及时检测的事件会使用中断。这种使用大循环的程序运行方式也叫轮询系统,加上中断处理函数后又称前后台系统,中断处理称作前台,无限循环称作后台。
多任务系统多任务系统是将各个处理模块编写为单独的任务,每个任务本身是个无限循环,程序运行初期会创建各个子任务,通过任务调度的方式,利用各任务的阻 ...
Linux基于流的IO操作
基于流的I/O操作与基于文件描述符的I/O操作过程十分相似,同样是使用相关的函数调用打开文件或设备,然后对文件进行读写,最后关闭文件。流I/O是由C语言的标准函数库提供的,这些I/O可以替代系统中提供的read和write函数。
流与缓存流和FILE对象基于文件的I/O函数都是针对文件描述符的,当打开一个文件时,返回一个文件的描述符,然后通过该文件描述符进行后续的I/O操作。
而对于标准的I/O库,它的操作是围绕流(stream)进行的,当用标准I/O库打开或创建一个文件时,已使一个流与一个文件相结合。当打开一个流时,标准I/O函数fopen返回一个指向FILE对象的指针,该对象通常是一个结构体,它包含了I/O库为管理该流所需要的所有信息。
缓存基于流的操作最终会调用read或write函数进行I/O操作,为了提高程序的运行效率,尽可能减少使用read和write调用的数量,流对象通常会提供缓冲区,以减少调用系统I/O库函数的次数。标准I/O提供了3种类型的缓存:
全缓存:直到缓冲区被填满,才调用系统I/O函数。
行缓存:直到遇到换行符“\n”,才调用系统I/O函数库。
无缓存: ...
Linux文件IO操作
文件操作是Linux系统中最常见的操作之一,关于文件的输入输出操作,分为基于文件描述符的I/O操作和基于流的I/O操作。本篇介绍基于文件描述符的I/O操作。
文件类型首先介绍下Linux系统中文件的各种类型与符号表示。
符号
文件类型
符号
文件类型
-
普通文件
l
链接文件
d
目录文件
p
管道文件
c
字符设备文件
s
套接字文件
b
块设备文件
基于文件描述符的I/O操作文件描述符Linux操作系统内核利用文件描述符来访问文件,文件描述符是一个非负整数,用于描述被打开文件的索引值,它指向该文件的相关信息记录表。
文件描述符的有效范围是0到1023,其中0、1、2分别用于标准输入、标准输出和标准出错。
类型
文件描述符
宏定义
说明
标准输入
0
STDIN_FILENO
命令的输入,默认为键盘,也可以是文件或其它命令的输出
标准输出
1
STDOUT_FILENO
命令的输出,默认为屏幕,也可以是文件
标准出错
2
STDERR_FILENO
命令出错信息的输出,默认为屏幕,也可以是文件
文件重定向重定向标准输出不使 ...
Linux进程控制
Linux进程简介进程是操作系统中的一个重要概念,它是一个程序的一次执行过程,程序是进程的一种静态描述,系统中运行的每一个程序都是在它的进程中运行的。
进程4要素
要有一段程序供该进程运行
进程专用的系统堆栈空间
进程控制块(PCB),具体实现是task_struct结构
有独立的存储空间
Linux系统中所有的进程是相互联系的,除了初始化进程外,所有进程都有一个父进程。新的进程不是被创建,而是被复制,或是从以前的进程复制而来。Linux中所有的进程都是由一个进程号为1的init进程衍生而来的。
Linux系统包括3种不同类型的进程,每种进程都有自己的特点和属性:
交互进程:由一个Shell启动的进程,既可以在前台运行,又可以在后台运行
批处理进程:这种进程和终端没有联系,是一个进程序列
监控进程(守护进程):Linux启动时启动的进程,并在后台运行
进程控制块在Linux中,每个进程在创建时都会被分配一个数据结构,称为进程控制块(PCB, Process Control Block),描述进程的运动变化过程,与进程是一一对应的关系。通常PCB包含以下信息:
进程标识符:每 ...
socket方式传输文件
socket通信实现文件的传输,TCP传输方式,python版与C/C++版。
python版服务器端代码TCPserver.py:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889# -*- coding:utf-8 -*-import socketimport osimport threading# 获取本机ipdef get_host_ip(): try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(('8.8.8.8', 80)) ip = s.getsockname()[0] finally: s.close() ...
LinuxGDB调试
GDB简介GDB(GNU Debugger)是Linux下一款C/C++程序调试工具,通过在命令行中执行相应的命令实现程序的调试,使用GDB时只需要在shell中输入gdb命令或gdb filename(filename为可执行程序文件名)即可进入GDB调试环境。
GDB主要有以下功能:
设置断点
单步调试
查看变量的值
动态改变程序的执行环境
分析崩溃程序产生的core文件
GDB常用命令
命令
简写
含义
file
-
装入待调试的可执行文件
run
r
执行程序(至结束)
start
-
开始调试(至main开始处暂停)
step
s
执行一条程序,若为函数则进入内部执行
next
n
执行一条程序,不进入函数内部
continue
c
连续运行
finish
-
运行到当前函数返回
kill
k
终止正在调试的程序
list
l
列出源代码的一部分(10行)
print
p
打印变量的值
info locals
i locals
查看当前栈帧的局部变量
backtrace
bt
查看函数调用栈帧编号
fra ...
Linux信号量及函数
信号量的概念信号量,或称信号灯,其原理是一种数据操作锁的概念,本身不具备数据交换的功能,它负责协调各个进程,保证保证两个或多个关键代码段不被并发调用,确保公共资源的合理使用。信号量分为单值和多值两种。
在信号的实际应用中,是不能只定义一个信号量的,而只能定义一个信号量集,其中包含一组信号量,同一信号量集中的信号量使用同一个引用ID,这样的设置是为了多个资源或同步操作的需要。每个信号量集都有一个与之对应的结构,其中记录了信号量集的各种信息,该结构定义为:
12345678struct semid_ds{ struct ipc_perm sem_perm; // operation permission struct struct sem *sem_base; // ptr to first semaphore in set unsigned short sem_nsems; // numbers of semaphore in set time_t sem_otime; // last semop time time_ ...
Linux共享内存及函数
共享内存的概念共享内存是指多个进程可以把一段内存共同的内存映射到自己的进程空间中,从而实现数据的共享和传输,它是存在与内核级别的一种资源,是所有进程间通信中方式最快的一种。
在shell环境下可以使用ipcs查看当前系统IPC中的状态,例如当前的电脑中:
1234567891011121314151617181920212223242526272829$ ipcs------ Message Queues --------key msqid owner perms used-bytes messages------ Shared Memory Segments --------key shmid owner perms bytes nattch status0x00000000 2260992 deeplearni 600 524288 2 dest0x00000000 2490369 deeplearni 600 ...