stm32 Ctext-M3内核最简单的多任务RTOS

   RTOS 实时操作系统,我做的是一个多任务的操作系统,可以同时运行多个任务,我这里设置的最大任务数是32个,

估计跑30多个任务的嵌入式设备很少吧,32个任务够用了。

OS我把它叫做HesOS,主要功能如下,比较简单。

1--实现多任务调度

2--实现任务调度锁

3--实现临界区保护

4--实现读取cpu使用率(这个功能比较重要的)

5--实现us延时(用于模拟如IIC总线模拟)

对于一般的嵌入式应用有这些功能,差不多够用了。

移植HesOS也非常简单,不会像其它的OS一样比较庞大,修改的地方也比较多,使用起来也复杂。

HesOS不管是移植和使用都是非常简单的,类似于PC的线程使用。

主函数初始化:系统一共跑了10个任务。

部分任务定义:

打印cpu使用量任务:

不能在所有任务里串口打印,因为串口打印非常的占用cpu,除非使用dma传输。

说一下移植,只需要实现以下代码

_uint32 fac_us;
//SysTick定时器
void set_systick(_uint32 ms)
{
	fac_us=SystemCoreClock/1000000;				//不论是否使用OS,fac_us都需要使用
	SysTick->LOAD	=	ms	*	SystemCoreClock/1000-1;
	NVIC_SetPriority(SysTick_IRQn,(1<<__NVIC_PRIO_BITS)-1);
	SysTick->VAL	=	0;
	SysTick->CTRL	=	SysTick_CTRL_CLKSOURCE_Msk|
									SysTick_CTRL_TICKINT_Msk|
									SysTick_CTRL_ENABLE_Msk;
	
	
}

/*延时us

这里裁剪的原子哥的


*/
void delay_us(_uint32 nus)
{		
	_uint32 ticks;
	_uint32 told,tnow,tcnt=0;
	_uint32 reload=SysTick->LOAD;				//LOAD的值	    	 
	ticks=nus*fac_us; 								//需要的节拍数 
	told=SysTick->VAL;        				//刚进入时的计数器值
	while(1)
	{
		tnow=SysTick->VAL;	
		if(tnow!=told)
		{	    
			if(tnow<told)tcnt+=told-tnow;	//这里注意一下SYSTICK是一个递减的计数器就可以了.
			else tcnt+=reload-tnow+told;	    
			told=tnow;
			if(tcnt>=ticks)break;			//时间超过/等于要延迟的时间,则退出.
		}  
	};										    
} 

//滴答中断必须调用以下代码,是关于任务调度的
void SysTick_Handler()
{
	
		if(now_task!=0)			//如果当前任务不为空则执行任务调度
		{	
	
			//任务调度
			tran_delay();
		}
}

把工程下的HesOS.lib加入工程,HesOS系统文件只有这3个

具体可以参考实例工程:https://download.csdn.net/download/hes_c/10667667

说明:本RTOS是借鉴freeRTOS和原子哥部分代码,演示工程是原子哥的库函数点灯工程。

改正下面C#的代码错误public partial class Form7 : Form { private BigInteger p, q, n, phi_n, e, d; public Form7() { InitializeComponent(); } private void Form7_Load(object sender, EventArgs e) { GenerateKeys(); } private void GenerateKeys() { // 选择两个质数p和q string string1, string2; Int64 n, p, q, phi_n, e; p = BigInteger.Parse("12347534159895123"); q = BigInteger.Parse( "987654321357159852"); n = p * q; phi_n = (p - 1) * (q - 1); // 选择e并计算d e = 65537; d = ModInverse(e, phi_n); publicKeyTextBox.Text = $"{n} {e}"; privateKeyTextBox.Text = $"{n} {d}"; } private BigInteger ModInverse(BigInteger e, long phi_n) { throw new NotImplementedException(); } // 加密函数 private string Encrypt(string message, BigInteger n, BigInteger e) { BigInteger m = StrToBig(message); BigInteger c = BigInteger.ModPow(m, e, n); return BigToStr(c); } // 解密函数 private string Decrypt(string ctext, BigInteger n, BigInteger d) { BigInteger c = StrToBig(ctext); BigInteger m = BigInteger.ModPow(c, d, n); return BigToStr(m); } // 字符串转换为大整数 private BigInteger StrToBig(string str) { byte[] bytes = System.Text.Encoding.Unicode.GetBytes(str); return new BigInteger(bytes); } // 大整数转换为字符串 private string BigToStr(BigInteger big) { byte[] bytes = big.ToByteArray(); return System.Text.Encoding.Unicode.GetString(bytes); } // 计算模反元素 private BigInteger ModInverse(BigInteger a, BigInteger m) { BigInteger x, y; ExtendedGCD(a, m, out x, out y); return x; } // 扩展欧几里得算法 private void ExtendedGCD(BigInteger a, BigInteger b, out BigInteger x, out BigInteger y) { if (b == 0) { x = 1; y = 0; } else { ExtendedGCD(b, a % b, out y, out x); y -= a / b * x; } } private void encryptButton_Click(object sender, EventArgs e) { string message = inputTextBox.Text; string ctext = Encrypt(message, n, e); outputTextBox.Text = ctext; } private void decryptButton_Click(object sender, EventArgs e) { string ctext = outputTextBox.Text; string message = Decrypt(ctext, n, d); outputTextBox.Text = message; } } }
06-12
在代码中,有以下几处错误: 1. 在类中定义了多个变量,名称相同但类型不同: ``` private BigInteger p, q, n, phi_n, e, d; ... Int64 n, p, q, phi_n, e; ``` 需要将其中一个变量改名,避免重名。 2. 在调用 ModInverse 函数时,传入了错误的参数类型: ``` private BigInteger ModInverse(BigInteger e, long phi_n) { ... } // 应该改为: private BigInteger ModInverse(BigInteger a, BigInteger m) { ... } ``` 3. 在 Encrypt 和 Decrypt 函数中,调用了未定义的 StrToBig 和 BigToStr 函数。这两个函数的实现已经在代码中给出,但是需要将它们的访问修饰符改为 public,以便在其他函数中调用。 修改后的代码如下: ``` public partial class Form7 : Form { private BigInteger p, q, n, phi_n, e, d; public Form7() { InitializeComponent(); } private void Form7_Load(object sender, EventArgs e) { GenerateKeys(); } private void GenerateKeys() { // 选择两个质数p和q BigInteger p, q, phi_n; p = BigInteger.Parse("12347534159895123"); q = BigInteger.Parse("987654321357159852"); n = p * q; phi_n = (p - 1) * (q - 1); // 选择e并计算d e = 65537; d = ModInverse(e, phi_n); publicKeyTextBox.Text = $"{n} {e}"; privateKeyTextBox.Text = $"{n} {d}"; } // 加密函数 public string Encrypt(string message, BigInteger n, BigInteger e) { BigInteger m = StrToBig(message); BigInteger c = BigInteger.ModPow(m, e, n); return BigToStr(c); } // 解密函数 public string Decrypt(string ctext, BigInteger n, BigInteger d) { BigInteger c = StrToBig(ctext); BigInteger m = BigInteger.ModPow(c, d, n); return BigToStr(m); } // 字符串转换为大整数 public BigInteger StrToBig(string str) { byte[] bytes = System.Text.Encoding.Unicode.GetBytes(str); return new BigInteger(bytes); } // 大整数转换为字符串 public string BigToStr(BigInteger big) { byte[] bytes = big.ToByteArray(); return System.Text.Encoding.Unicode.GetString(bytes); } // 计算模反元素 public BigInteger ModInverse(BigInteger a, BigInteger m) { BigInteger x, y; ExtendedGCD(a, m, out x, out y); return x; } // 扩展欧几里得算法 public void ExtendedGCD(BigInteger a, BigInteger b, out BigInteger x, out BigInteger y) { if (b == 0) { x = 1; y = 0; } else { ExtendedGCD(b, a % b, out y, out x); y -= a / b * x; } } private void encryptButton_Click(object sender, EventArgs e) { string message = inputTextBox.Text; string ctext = Encrypt(message, n, e); outputTextBox.Text = ctext; } private void decryptButton_Click(object sender, EventArgs e) { string ctext = outputTextBox.Text; string message = Decrypt(ctext, n, d); outputTextBox.Text = message; } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值