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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # w* F% i# m( |/ r9 y4 l' X
2 B; X# O% R  z/ y! x9 A
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% G/ f& {5 G( v
#include <unistd.h>
! T( @1 B9 w$ c9 K4 K/ `#include <sys/mman.h>
: c+ L/ g5 N, C. ?: Z#include <sys/types.h>
5 `# y, [: P: C# m: d& {* F4 S3 [#include <fcntl.h>
& z/ w! E- y7 b
0 Y1 X; q; X1 G5 L& a  G1 S#define SHAER_RAM_BASE_ADDR    (0x80000000)   
" O* {) Q- e! K) Z  P4 G$ E7 j, K, W( i
typedef struct# W7 q$ @7 V3 O- J; ]" a
{3 W$ \/ Y/ X9 Q) t
        unsigned int a;: j& I2 ]- P8 b$ _7 m5 [$ M3 z
        unsigned int b;% W+ n7 s% b7 I, ^1 y  j: D. I# H& C
        unsigned int packet_cout;. R7 g% L2 ^% Q7 p) S" B8 a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  e2 I2 ~0 h; X8 k8 @% {1 _' [" M$ b: G/ @  O1 z! C/ m6 _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ C* O! v! I  y/ {& J3 p9 z
unsigned int count_copy = 0;
  A, v4 a+ H& z& y6 s
4 z8 w" n  I2 m, y. i$ G7 L5 K
  g. T1 I/ Y3 `! U4 ^  F* [, n/ vint main()
) M- ~. E4 d' v5 Y5 z{" O0 _9 u* \; r# c+ y2 D
        pRX_MSG_PROTOCOL pshreRAM = NULL;3 l( ]( l9 h4 @; ~9 x3 f% _* K
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! u+ p2 e8 j, C# Y

' A* _- |) q( G( ?: M/ v( F        while(1)* M0 w  l% [/ _
        {& g8 q: @6 Z  x
                read_MSG_buffer(pshreRAM);
8 H9 W9 Q2 V$ i        }               
# p- v; H3 b: Y9 C6 N}
( A+ }5 G  g9 `" O7 b- {1 I+ T/ f9 Z( ?1 c9 r4 X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 j. k; g: r6 f
{
; z% Q6 T2 v) h3 g; r9 J        RX_MSG_PROTOCOL buf;7 \, c7 m& e' n. I( L' U
        
0 n6 O! M1 n4 E        buf.a = pshreRAM->a;
8 h$ I! `% c9 r0 p        buf.b = pshreRAM->b;3 V& l# Z/ Q& j* b
        buf.packet_cout = pshreRAM->packet_cout;
% q$ a  q5 Y8 c. F: q2 X. w8 i        
3 h, q) n5 A) ]% A' v# |        if(buf.packet_cout != count_copy)
$ Q1 m& c( q9 Y. M% @        {% C9 C) Z' |4 G8 j, x: v$ M# a
                printf("a is %d\n", buf.a);+ J! J6 i- A% i* T) w
                printf("b is %d\n", buf.b);
! U& p3 t* C6 V5 r: L" \! E5 a6 Q                printf("count is %d\n", buf.packet_cout);& {+ _! k2 t# r8 t% s2 ?
                count_copy = buf.packet_cout;+ z. I- w; Q  E# [/ E# `, o
        }0 f) \; I( h$ f3 G0 Y" t
        else) F1 q6 `1 A' c; s( R
        {$ ?. K) K, S3 Y1 O
                printf("No effective message!");1 o; L! o# C; O  S- {
        }
2 {2 l! Q5 s7 \  y2 X- K) W. ^0 P}
( r5 V# A) E: ~% C/ l7 D3 U
) i5 B, G* K& j, T8 a: \/ h6 i9 @1 b, {, a
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& H: P3 ~4 T2 W' F& X
使用下面代码,对内存使用了mmap函数后:/ \: W' K2 z: l- Q9 t5 f# _( e
#include <stdio.h>! _! b7 [. r! E) F4 U
#include <unistd.h>
& \7 [$ \: l, c$ Q: O& k#include <sys/mman.h>
4 N8 @0 a& V  M5 ~, K#include <sys/types.h>
6 X3 ^8 u" D% I9 I3 h0 P% `/ B6 ?#include <fcntl.h>, _% W- [) {6 r
6 }- t0 _4 N, \6 x
#define SHAER_RAM_BASE_ADDR    (0x80000000)2 w) G# z3 z% ?
#define SHAER_RAM_SIZE         (0x20000)   : c# m; W5 X$ S8 r
- O) p/ Z$ X" h
typedef struct* \7 n4 r) J3 p: h$ b
{" l& f/ L) w. P+ M4 w( x2 {
        unsigned int a;
7 i& N# z& ?0 ~/ Q* ~  ~        unsigned int b;: J2 L( f* i  n/ u! H
        unsigned int packet_cout;& H9 z; Q: U9 b( k8 e  C" r! B4 F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" m% ^5 t( a2 K' z6 X* E& G: @
! S. X( t0 ?$ D
void read_MSG_buffer(int *baseaddr);
! ]  m# u4 \3 A# R  u4 j" dunsigned int count_copy = 0;
' S! v+ `3 d) q; f. z) a" a) U# S& L1 E' m7 X# G9 \
int main()
+ m* x( O9 h. N5 j9 x$ r" Y* D: n! W{( }, P% W  G& P
        int fd;
7 w/ d1 N3 g( `& C+ i) T        int *mem = NULL;  ]! C7 R5 J5 W% _; [
$ z: q) z  M' \* b. T( }; J
        if((fd = open("/dev/mem", O_RDWR)) <0)1 {( b2 ?, x* c
        {" P  B8 O$ e/ B5 c
                perror("open error");
" C; ~5 `( E" w                return -1;
  O9 z' o' M9 {, s2 U; _- M        }
# L$ b: g$ S- n1 A* v, Q        
& U% R8 J# R. S" O5 a8 X' q* q* I$ r        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 F& ~. D. N2 \9 t$ Z" k
( a) j, A9 X* J3 s        while(1)
" M# `; X7 T$ a        {
7 P, S  ]3 C% R: o6 q1 s4 o# R' I                read_MSG_buffer(mem);
; p" R/ n2 O. k/ P, |+ K# M        }                  k- Q% w4 A1 n! x
}
9 ?: U7 d& L5 b3 |  s' w: q' _$ s3 T
void read_MSG_buffer(int *baseaddr)
8 k1 m, v( c# d; x  e6 V$ Z$ |' f{
4 }' H  R8 m* k! p# h; s        pRX_MSG_PROTOCOL pshreRAM = NULL;, T1 I, g0 J8 b
5 X  _! w2 e% ~1 {6 ]' {/ n
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 S* g! B: H( ]& c5 P$ G* e' `+ d
        if(pshreRAM->packet_cout != count_copy)
0 a: {) H+ A2 C1 M4 \- |        {
" d4 P; Z0 I3 h7 z1 U# M) h. ?                printf("a is %d\n", pshreRAM->a);
* T$ C; {6 c! _9 X1 h5 X: M$ O' M                printf("b is %d\n", pshreRAM->b);7 ?+ {7 u4 N* i. G. e& Q
                printf("count is %d\n", pshreRAM->packet_cout);
. ~5 U, [+ U3 O! n: k/ N8 E( G                count_copy = pshreRAM->packet_cout;
$ `+ h" E- x6 u5 A        }( p% _! h  z% \8 Y, o
        else: j: c; `3 d+ n
        {
- ^/ Z( \8 U1 w/ {                printf("No effective message!\n");
! r0 E/ }/ ?; t% h4 k4 ^        }7 |! m8 \5 h8 R1 u& f
}+ x: Y( p8 I% g9 I! ]
7 I" {% u  W$ T; ~
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* i4 Z# D* q5 |2 f% i0 y- j
8 V7 q3 Z- Q/ k7 o7 g
- U9 P- V& Z9 H: m( D
1 U! o, Z7 y% Z; e4 u2 @4 y4 E! v( E& t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-5 18:22 , Processed in 0.037582 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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