Newlib特点
时间:2022-02-07 16:00:01 | 来源:信息时代
时间:2022-02-07 16:00:01 来源:信息时代
C运行库的可重入性问题主要是库中的全局变量在多任务环境下的可重入性问题,Newlib解决这个问题的方法是,定义一个struct_reent类型的结构,将运行库所有会引起可重入性问题的全局变量都放到该结构中。而这些全局变量则被重新定义为若干个宏,以errno为例,名为'errno'的宏引用指向struct_reent结构类型的一个全局指针,这个指针叫做_impure_ptr。
对于用户,这一切都被errno宏隐藏了,需要检查错误时,用户只需要像其他ANSIC环境下所做的一样,检查errno'变量'就可以了。实际上,用户对errno宏的访问是返回_impure_ptr->errno的值,而不是一个全局变量的值。
Newlib定义了_reent结构类型的一个静态实例,并在系统初始化时用全局指针_impure_ptr指向它。如果系统中只有一个任务,那么系统将正常运行,不需要做额外的工作;如果希望newlib运行在多任务环境下,必须完成下面的两个步骤:
1)每个任务提供一个_reent结构的实例并初始化;
2)任务上下文切换的时刻重新设置_impure_ptr指针,使它指向即将投入运行任务的_reent结构实例。
这样就可以保障大多数库函数(尤其是stdio库函数)的可重入性。如果需要可重入的malloc,还必须设法实现__malloc_lock()和__malloc_unlock()函数,它们在内存分配过程中保障堆(heap)在多任务环境下的安全。