嵌入式之模块去初始化篇

嵌入式之去模块初始化
初始化和去初始化一般是成对出现的,而很多时候,往往会忽略去初始化过程,因为部分的情况下,进程一结束,资源就会被系统自动回收,也就没有去初始化的必要,这个很容易养成忽略去初始化的过程,系统资源管理考虑不全的习惯。当分配堆内存时,申请共享内存、申请锁资源等系统资源时,如果在进程退出后,不做销毁、释放,就会占用系统的资源,影响资源的配置、进程的正常运行。所以不管什么时候,都应该养成去初始化的习惯。
去初始化只要考虑一下以下方面:
(1)内存释放
(2)线程释放
(3)系统资源销毁(共享内存、锁资源、信号量等)
(4)释放描述符(tcp通信描述符、文件描述符等)

内存释放
内存释放需要注意几个细节
(1)避免野指针
内存释放后,需要将指针置为NULL

free(p);
p=NULL;

(2)内存释放的先后顺序问题

struct str
{
	int age;
	char *name;
}*str_manage;
str_manage = (struct str *)malloc(sizeof(*str_manage));

如果先free(str_manage);后free(name);则是由问题的
因为free(str_manage),结构体内的name变量占用的空间被释放了,此时的释放name就会出错。
正确的做法是先释放结构体成员free(name),后释放结构体(str_manage)

线程释放
通常会建立一个全局变量来控制线程开启与关闭,初始化时就将变量置为1,去初始化时就将变量置为0。
例如:变量Quit来控制线程的开关,去初始化时只需将Quit变为0即可实现线程的退出。线程退出后需要对资源进行销毁。

int Thread_fun()
{
	while(Quit)
	{
		
	}
	return 0;
}

Linux系统中程序的线程资源是有限的,表现为对于一个程序其能同时运行的线程数是有限的。而默认的条件下,一个线程结束后,其对应的资源不会被释放,于是,如果在一个程序中,反复建立线程,而线程又默认的退出,则最终线程资源耗尽,进程将不再能建立新的线程。

线程释放分为可结合的(joinable)和 分离的(detached)两种,线程默认是可结合的。可结合的线程在线程退出后不会立即释放资源,必须要调用pthread_join来显式的结束线程。分离的线程在线程退出时系统会自动回收资源。

(1)分离线程
在线程中调用pthread_detach(pthread_self());
注:设置为分离的线程是不能调用pthread_join的,调用后会出错

(2)可结合线程
使用pthread_join回收线程。三种线程退出方式可用pthread_join回收
1、子线程使用return退出,主线程中使用pthread_join回收线程。
2、子线程使用pthread_exit退出,主线程中使用pthread_join接收pthread_exit的返回值,并回收线程。
3、主线程中调用pthread_cancel,然后调用pthread_join回收线程。

void pthread_exit(void *retval);   
参数:retval表示线程退出状态,通常传NULL

int pthread_join(pthread_t thread,void **rval_ptr);
//成功返回0,否则返回错误编号

int pthread_cancel(pthread_t tid);
//成功返回0,失败返回错误编号

注:分离线程的资源可以自动回收,但无法确定线程资源是什么时候回收的,可结合线程是人为自动回收,可以确定线程资源是什么时候回收的。

系统资源销毁
(1)互斥锁

pthread_mutex_destroy(&AudioAlarmCtrl.AudioAlarm_mutex);

释放描述符

close(fp);
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要快速了解Autosar嵌入式开发的整个逻辑调用流程,可以按照以下步骤进行: 1. 学习Autosar基础知识:了解Autosar的基本概念、架构和工作原理。Autosar是一种标准化的嵌入式软件架构,包括底层的硬件抽象层(MCAL)、中间层(RTE)和应用层(Application)等组件。 2. 学习硬件初始化:了解硬件初始化的过程,包括时钟配置、中断配置、外设初始化等。这通常由MCAL(Microcontroller Abstraction Layer)来完成,MCAL提供了与具体硬件平台无关的API。 3. 学习Autosar模块初始化:了解Autosar模块初始化流程,包括BswM(Basic Software Mode Manager)的启动、ComM(Communication Manager)的初始化、Dcm(Diagnostic Communication Manager)的初始化等。这些模块负责管理系统中不同模块之间的通信和状态转换。 4. 实现功能模块:根据应用需求,在应用层实现具体的功能模块。这些功能模块可能涉及到通信协议、数据处理、状态机控制等,具体实现方式可以参考Autosar提供的API和规范。 5. 配置和组装软件组件:使用Autosar工具链,如Vector DaVinci Configurator或Elektrobit Tresos等,进行软件组件的配置和组装。这些工具可以帮助生成Autosar标准的配置文件和代码框架。 6. 进行集成测试:将各个模块进行集成测试,验证整个系统的功能和性能。可以使用仿真器或目标硬件平台进行测试。在测试过程中,可以使用调试工具和日志来分析和排查问题。 7. 优化和调试:根据测试结果,进行性能优化和问题调试。可以使用性能分析工具和调试器来分析代码执行效率和定位问题。 通过以上步骤,你可以快速了解Autosar嵌入式开发的整个逻辑调用流程,从底层的硬件初始化到功能实现的应用层逻辑。但是要注意,Autosar开发是一个较为复杂的领域,需要结合具体的项目和实际经验来深入理解和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值