嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- x4 j( A$ z2 g0 y. a7 Y
9 L6 Y' F$ G1 G1 J6 W' e
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: L$ |' M. Q% F+ ^( ]
#include <unistd.h>
( V5 k, D# y, }5 m& {
#include <sys/mman.h>
# S5 }0 s) U y9 w' x
#include <sys/types.h>
x' n- P8 S. N% ?5 E2 s
#include <fcntl.h>
* m7 l. c( b" j+ }+ V8 \+ B
. Y; i; Z& H, q5 t
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 e# k' M& t; }1 g+ i; W; H
7 h2 i3 V- T5 O/ z; K
typedef struct
$ }1 ]/ A9 z) V+ C }! f! T
{
4 n* J% K: j$ t! \9 I0 r) L# T* q
unsigned int a;
/ P4 V& q( i1 g% C6 L }8 c
unsigned int b;
% I2 f/ J$ @* |; v- G
unsigned int packet_cout;
( K4 ^2 X3 p0 e9 p! m+ A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& i- u3 e/ o; O- x Q$ x
# N% h" \% w X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! n- [; d3 x( Q& s( r
unsigned int count_copy = 0;
$ M' z: h/ |* G' ?
% ^0 A9 y# o3 B) I1 m. r/ h! J
' y: M3 W/ p0 E; i' t6 j/ M) L5 y
int main()
5 g. L" W3 Q& H6 s: v5 d" k
{
7 H1 z0 H6 I; z: r1 d3 y+ A3 S
pRX_MSG_PROTOCOL pshreRAM = NULL;
: Q( A: q+ X0 M/ [" u/ [6 b X
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* f# s6 c. g# G T! }6 v/ f
- B4 ^9 `, i; u7 {* Y
while(1)
( a0 U& y B* J
{
' b; h% E* n$ H: L0 O# ?
read_MSG_buffer(pshreRAM);
1 h8 s0 v" q; b# T6 `
}
6 `6 ?8 V; B( _! Z3 I
}
o2 s8 r" `; b! \" } t, N9 C
2 ?7 C0 }- \8 }3 i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& }0 _7 K" H. f1 m/ C# g! \
{
5 ^$ A5 J1 P4 N/ J
RX_MSG_PROTOCOL buf;
- ~2 T9 V8 J- v8 i1 l# f: L/ T
/ Q6 R( A% E2 T0 n8 x6 b
buf.a = pshreRAM->a;
2 {4 ]: [9 v# d
buf.b = pshreRAM->b;
) ]& F. [. J- K! c) v. y
buf.packet_cout = pshreRAM->packet_cout;
$ ^8 o- D2 t# _, Y. m5 P3 c
3 h0 E2 P. }5 I7 H7 Z/ _
if(buf.packet_cout != count_copy)
N3 A; O* [3 E/ n
{
4 V |, I2 h/ \( a9 u& e
printf("a is %d\n", buf.a);
' A6 F. F, q/ W# w/ O; M
printf("b is %d\n", buf.b);
: f' R+ Y1 `5 m2 u# o/ a
printf("count is %d\n", buf.packet_cout);
" S) N8 u/ E- O! B
count_copy = buf.packet_cout;
5 ^3 @% [7 s+ |
}
6 u4 x) a4 f5 p$ ?1 p
else
6 n$ j. d: k. A. M5 J+ X
{
8 d& [, s1 i% X) V
printf("No effective message!");
5 w' J4 h5 N4 F' z# M1 {9 A
}
' F/ k2 u* S' O# [
}
% f* N5 U. K% V# ~% d2 {4 I: @! l
1 p0 @) _" F7 |( }" ?: r
4 q X& ~; T* Q4 q }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 x% O$ v5 j$ _; {( U
使用下面代码,对内存使用了mmap函数后:
) ?( n Y! D6 }1 [. V
#include <stdio.h>
" ]1 M: c" B' H% d& ~6 M
#include <unistd.h>
9 P4 c! U/ d+ n! Q# z
#include <sys/mman.h>
% n) O w3 s; m% ]$ e* P7 ]
#include <sys/types.h>
( e- t2 s+ m0 q0 m2 J% r1 n
#include <fcntl.h>
: i1 I4 H1 F4 `2 G+ \
: J5 Z: e" }. u
#define SHAER_RAM_BASE_ADDR (0x80000000)
" ]+ ?. t y8 A+ z E1 ]3 [/ m
#define SHAER_RAM_SIZE (0x20000)
$ M% f( s% E0 s( o. B* T
% D4 S) b2 A- Q1 v0 Z; Q
typedef struct
: s. G! g; q# ]9 Y; e
{
# U4 v2 I$ o* ^9 B( F$ F4 f( K# Y% Y
unsigned int a;
: D3 \- N& u! l1 r
unsigned int b;
8 K% j1 u% e- Q7 r7 W
unsigned int packet_cout;
0 \' C! {; s+ Q) B$ }0 J H2 X+ }5 w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; E) J$ g _* U7 b9 ^: a5 G, [1 \
# j5 u) t2 X0 ]: Y2 Y0 `6 I
void read_MSG_buffer(int *baseaddr);
5 \, N. I' H& x( j. I! t
unsigned int count_copy = 0;
. a6 U8 K5 [% s4 X3 D
1 L' Z+ ^# V% S( F0 u- A. \* W: {
int main()
( L& {/ z% m9 U
{
, R+ }' P" h, s+ n! V! |/ {: ^5 C
int fd;
0 e+ O, T5 c: C( {/ Y2 D- T
int *mem = NULL;
9 I' D- ~$ K1 S g7 g+ g4 R
/ `' T3 h2 `. X- w% b% `
if((fd = open("/dev/mem", O_RDWR)) <0)
* {% U7 j7 h+ r- t4 e9 }# }+ b
{
4 `6 ~% z6 N' o% l
perror("open error");
0 X4 O; }: T/ M3 d7 r: ~' l
return -1;
* y5 u; C' ]$ i& ?
}
6 ]; T( j7 [- L j% j) H8 ]
: b5 A: G: b2 y7 [3 l( G, B0 A
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' k3 N( r+ u+ c' ? s) Z
/ M. L5 B+ c3 K5 V; E! K! G
while(1)
3 n o- s4 w! ^4 c6 p$ `; @/ D& `+ p
{
) m( k% \! {# W/ {- L1 ` t# r
read_MSG_buffer(mem);
" K% c8 {9 _$ ?) Z& `( Z
}
; O7 }; u$ u' ]' i& J
}
1 S" R0 E( @; P4 Y1 r- c; Z
4 a7 ^) R5 Y7 o( k8 x6 B
void read_MSG_buffer(int *baseaddr)
" O0 H5 X H/ r/ i
{
" F1 l l1 D. Z
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ Z% R" [/ [1 o
( V! a% A' A7 B2 s+ A
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- d. b' h8 }- I# ]
' q3 z c4 ]* o5 I# L! s
if(pshreRAM->packet_cout != count_copy)
3 ` |. J! C/ R
{
8 n* n% t7 _( |, Q
printf("a is %d\n", pshreRAM->a);
0 M5 D, k' C$ m. c/ y
printf("b is %d\n", pshreRAM->b);
8 j/ _6 O" T& k5 ~
printf("count is %d\n", pshreRAM->packet_cout);
, M$ t$ y% I8 r+ `7 x# G9 J0 @
count_copy = pshreRAM->packet_cout;
* \; ~6 p& |$ z- D3 J4 ?, Y8 f
}
; T7 F: @ x( ^/ O: M
else
5 @% R1 X2 V9 b$ ~+ R! N
{
& c+ y3 i6 v3 j! s$ l" P, ?
printf("No effective message!\n");
4 ] ?$ T5 d& Z9 W( J
}
$ T5 \# L! l% d0 m& Y
}
! T* H& I+ i3 W7 {( l9 N4 p4 A
% W; a2 ^; x3 m- u% j( D( K: D! ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 `7 j1 L. U; y% ]8 h4 N' L5 u
& p1 X5 F/ ?7 s$ _5 r
/ O: b* I( z7 y) Z7 p
* M5 Z5 R4 Y; @' M% e- X# y
`; F' i' W0 o; [$ h- P
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4