OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5376|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 t. p( k' L% Q! c, X
9 @- D$ h7 Y5 O# z, Y; x6 g
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) G, h' m. x2 x2 w1 s( V+ L
#include <unistd.h>
, ^. R$ s4 U* s: C4 x" n#include <sys/mman.h>
8 u( H9 F' w2 d* ^7 }9 U#include <sys/types.h>
; z  ~" l5 \& M* n#include <fcntl.h>+ @4 {$ K  W1 O' B  C! ?
0 n6 X  @$ A: X$ e9 `# X- k! j7 O
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! t" f+ l- y( l3 I% u" O' H

2 o+ ~+ B. ^( [typedef struct
" f) u4 Q# I* ^, R( m$ B  ?8 r# k{
! h5 a  j, H8 c5 Q        unsigned int a;
3 y" n+ t7 Z$ k2 @        unsigned int b;
+ n5 [. H4 B0 h) i' q8 U' n        unsigned int packet_cout;- z1 }, A4 y5 v& ]$ Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 c. |8 ]5 j3 k& z
  i8 i5 \# l" _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% {/ Z" p0 d" N3 J3 ]! W
unsigned int count_copy = 0;% _/ p7 L1 O: `4 [- P; ^
) R, n4 {: [4 T0 i$ I
  @& \0 N. m# i6 |; j1 E0 R( G3 O
int main()
% I2 P+ Z  G  c0 d( E( p{
) X7 q4 n" A, I9 L4 r        pRX_MSG_PROTOCOL pshreRAM = NULL;  n& N0 l" A# t$ X. l: g
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  x; {3 o/ c' u9 O9 j2 M9 Y( c- W

& x% T' _$ I$ M( D1 U        while(1)
; {6 H5 R. N$ R4 @2 \        {. Z; P; K: o4 Z' B! Y9 s0 Z
                read_MSG_buffer(pshreRAM);
9 I$ c) v/ g) l3 T5 J9 N        }               
, f& {8 f* Q* u}# b% `- h4 {) S4 g5 k
: s6 D* I2 l* U8 X: a/ N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 F  G% c# \1 O+ V9 Y/ G, P$ b1 J{
5 j7 R' `$ Y. l2 c( ^& U' B        RX_MSG_PROTOCOL buf;
$ o7 f0 X# ]; r: O& w6 i: v        5 v, a" U  V; {& x8 ]! x  h
        buf.a = pshreRAM->a;
( H/ e* P+ |9 S4 u. L1 N6 {        buf.b = pshreRAM->b;& u5 O2 M1 J3 b& P6 ~( f1 i  H
        buf.packet_cout = pshreRAM->packet_cout;" u; V+ P, H$ v
        * z$ s( Z- E7 A# V* J3 m3 X
        if(buf.packet_cout != count_copy)" R# C3 o' W* _, [
        {4 E0 g& a0 ]4 x4 _9 }5 \0 G" b
                printf("a is %d\n", buf.a);
* O  C0 ?3 I- d0 N& s. h. u! c                printf("b is %d\n", buf.b);
0 g" L: M( i) c+ y                printf("count is %d\n", buf.packet_cout);& ]; b/ m' W5 D! @) C
                count_copy = buf.packet_cout;
' M, I( p! S6 U! K        }
, a( {# ~4 |1 J- t6 R3 B        else0 @7 Y$ I* k: z& ]
        {3 \9 i( K: N+ O1 i; }
                printf("No effective message!");" j& _$ Z. e3 |) c& ^1 T
        }1 z+ x( ?' H3 p8 z6 Z
}
0 B1 `9 d( M) z" ~+ N3 e
6 B# j3 d% F: k1 {7 x' ~% F! E9 g1 f) i3 ^
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! Z+ g* Z4 B' b9 k使用下面代码,对内存使用了mmap函数后:
+ @. h1 ?4 m' }/ W#include <stdio.h>3 y) }$ E! p  J; R4 z  G
#include <unistd.h>/ c0 M3 @9 V% [/ E
#include <sys/mman.h>/ e& h% A3 ~' T! _: I' }% W! G( _& L$ d1 @
#include <sys/types.h>5 K" L+ k9 u, h2 L+ L
#include <fcntl.h>
2 T7 |0 a# H" [5 E9 {- E6 I9 Y( g
#define SHAER_RAM_BASE_ADDR    (0x80000000). l% ]$ l! S' u! R/ k) F
#define SHAER_RAM_SIZE         (0x20000)   
9 `+ C* l8 p; N) ~$ Z& o5 R
( W8 B0 c* T5 p+ Q/ B6 g, utypedef struct/ w1 M& |1 [6 L4 k  P5 e0 l4 i
{
9 l2 D8 L& S( B        unsigned int a;2 A* F8 g! L4 y7 I1 I
        unsigned int b;
: t6 S- L7 c. m4 B        unsigned int packet_cout;4 B6 P3 N5 f4 B6 s" Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ @3 ~+ U+ t7 H1 c! U. [& {1 o
( t  O  M: J  h. Q: V5 V
void read_MSG_buffer(int *baseaddr);8 g  T$ z+ M7 A
unsigned int count_copy = 0;  ]6 n: {' t" E- _
/ j  ]1 t! Q+ l( e2 @9 H
int main()
% [; a  W' y6 Z2 x; d* E: Z- r5 m{; k/ i; J/ B; H9 o$ S
        int fd;
& R# [1 P# F* p4 B% N) ?2 n        int *mem = NULL;
- J) w/ ?3 p: D* H$ C, H% ?8 i5 E4 Z* d" r' D" U; z2 S
        if((fd = open("/dev/mem", O_RDWR)) <0)
7 \* _( s! n& j" S0 m        {
/ i# p  q% ?* C8 w$ U: G                perror("open error");5 K4 s" F0 O/ ?- D
                return -1;9 S# w- ^5 v( R! y' J
        }
& d- `1 E5 t, y$ D- t- U        
5 c4 P( A# T2 k( c( i4 R4 W" D        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( S7 b# w" [  B! v- }

" f9 D( f0 z+ o6 ^) f* Z        while(1)
$ d  q# f* Y* |# g6 @        {
; s$ v' r7 V6 O( z$ C9 S                read_MSG_buffer(mem);+ o/ d. `$ O7 E6 Z1 D+ ]
        }               
8 F4 L, S" O' R9 h% A2 d) N}
2 D' L/ n( x5 v2 z& B  ^3 g) R# e0 ]! [
void read_MSG_buffer(int *baseaddr)
9 B: `2 B1 n- @" u8 h{7 w2 [3 e/ Z, K( O6 w
        pRX_MSG_PROTOCOL pshreRAM = NULL;5 d0 W6 j  y/ V+ N3 w5 d8 x

. m  k" G5 K$ V  E: H        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 `- v7 h, T5 B% I' }; e# H  V. T7 q
4 z7 @: P: g: `2 L2 ]5 k. I        if(pshreRAM->packet_cout != count_copy)
; f" G3 ~! C$ h9 V, E8 C" t        {2 S3 f' f) K! `" N5 {
                printf("a is %d\n", pshreRAM->a);7 i4 J2 ]+ I% _8 P
                printf("b is %d\n", pshreRAM->b);
4 s7 s4 D5 J4 k7 r                printf("count is %d\n", pshreRAM->packet_cout);
# o' e& h- K$ U' G4 w% K                count_copy = pshreRAM->packet_cout;) g+ q% a3 t7 G" C, q% n
        }
$ r; D$ q; U+ i' ^& _        else) v, \! C/ F+ y1 F! P+ I
        {
* D1 S* R+ N) W; V: c4 y                printf("No effective message!\n");
8 I7 x, z; j; J5 ~        }
/ h8 Y( V0 R0 x  v1 M: v2 g9 y}; `, F) t& p  j7 P  T( Q
' `' s4 U0 t% Y. f
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! g! _2 R. S+ g

% u4 u) E* n5 ~  C% U7 l8 l4 G3 o/ C
) Y; z+ t! D" s1 X- z2 Y% k
. m0 A' a. U4 g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-12-27 12:16 , Processed in 0.040744 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表