OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# j9 |$ M6 {7 d: e4 _) o6 s
1 O* a6 y/ G5 p  ^' b; Z! l( mOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! O0 Q4 E/ k: q( i' [1 v#include <unistd.h>$ v, Z* f9 F( e; _  Z
#include <sys/mman.h>2 |: q" J/ d0 A, K, X/ w
#include <sys/types.h>
+ C+ D5 n2 v4 ^; f#include <fcntl.h>
, a6 l( A. }0 F5 k, d+ |$ k6 A5 q, V4 b
#define SHAER_RAM_BASE_ADDR    (0x80000000)   . y! Y, g' C& p) ]8 X/ X1 z

3 `; O6 |  }+ l3 Xtypedef struct1 P0 x+ f! B  u+ o
{
. F$ v4 ?; V; v0 q        unsigned int a;
' @. D  U1 e1 f; X4 s8 ~( T5 g        unsigned int b;( Z" ^+ Q$ o; l1 w; U
        unsigned int packet_cout;+ K2 F: J" i  L6 r' Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# W  T2 D! x  e

* k) D4 x7 u9 U4 F, m6 G( m& Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" F2 l7 h5 h# X# L/ Iunsigned int count_copy = 0;4 F* l0 Y& ]% C$ }

- E- W! u6 D4 p6 j- X+ ^+ |; [
4 e8 Y: s& T1 S; l5 r1 G; S. qint main()
# v# G& B" \" A4 I9 G- s2 u{
3 v. y  D5 [& g1 X- Q% P: N- f* ]' O        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 i( W0 N( ]' u* f        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 s* i- m* b* ]% L" O( X; a

" n0 J! O! T+ M$ w# Y        while(1)
4 s) i( G0 A! R+ |: C# a% g        {# x( B' k1 r% ^' G
                read_MSG_buffer(pshreRAM);3 J! T7 c0 @6 j5 M) {: d  {! q
        }                ; E* v/ v. }5 Q* @/ ~1 F3 i
}, B/ Q4 s! \; Z: q
% X' u5 Q5 `) f, E2 M  x0 e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 n( |0 J. {# p: F{& ]: P3 _, X! N2 w0 W
        RX_MSG_PROTOCOL buf;2 h* S& K5 c' @# c5 S# f5 E
        
* Z9 h+ y+ Z9 w& v; v8 s        buf.a = pshreRAM->a;* O. J$ @9 L, _$ G8 ~; u, o0 A2 [
        buf.b = pshreRAM->b;( G8 ?/ t' l+ l* S2 R1 I5 B
        buf.packet_cout = pshreRAM->packet_cout;- v9 L7 |8 C- |* J0 \2 M( o  X
        1 g2 s2 z1 F" o& O& d
        if(buf.packet_cout != count_copy)
& J$ r& E$ n  L        {" C4 U# s/ j( S' L& U6 c9 T6 D4 |
                printf("a is %d\n", buf.a);
* C9 R6 K/ q3 b$ L& T# h                printf("b is %d\n", buf.b);# |8 x' f6 i9 j' l( c8 \
                printf("count is %d\n", buf.packet_cout);, ]5 S& I9 M" ]" S
                count_copy = buf.packet_cout;- Y$ V" B5 b- b. _7 d0 j+ i
        }
8 R, Q3 v* k+ q9 ^; P        else
8 e2 F. i+ T5 P3 v% q- P# a        {
" R; p+ _4 z/ q( a) Z                printf("No effective message!");
' X4 x  E* S6 M4 e( V        }0 G, l4 y# D! O0 O% k
}
+ o% U1 f6 w7 r2 t8 O: ?, ]1 g- D( ~* b* C1 a" t7 w

! |. k' d% W: a& y' j3 J# w但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) q: x8 m+ C2 B3 E1 v% r; F
使用下面代码,对内存使用了mmap函数后:
5 L3 P1 m* B( U6 m' J#include <stdio.h>
/ ]& h4 U  v1 U4 \$ P3 Z2 X#include <unistd.h>! I1 E1 X8 j; q3 V
#include <sys/mman.h>; p. O9 j! C/ G, {" D6 e; y5 b' C: }
#include <sys/types.h>
' n3 k8 h9 D, X9 q#include <fcntl.h>
# k8 H  z, ]3 ~6 K9 v; R1 c- _# D' w# _
#define SHAER_RAM_BASE_ADDR    (0x80000000)3 a! j& F7 E5 _8 |# ?
#define SHAER_RAM_SIZE         (0x20000)   
! w+ ~% l! ^5 k! ~) j3 s/ I" h% e2 j3 s) }5 c; J
typedef struct
# x! z$ N7 j) Z0 A; R{1 x- g! `" L3 A7 k: x
        unsigned int a;
4 J8 @1 m# b2 l( j- M        unsigned int b;
; g( u# g) E9 f8 ?; @& k        unsigned int packet_cout;
' c+ J/ u2 |' w9 X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 |) I4 P, j3 h2 ~

9 _' h" F. R; @& e( Cvoid read_MSG_buffer(int *baseaddr);& w" Y- R3 A8 E/ Q  v# Y2 A
unsigned int count_copy = 0;' m9 K$ K. l% C
6 o+ r9 K: A! E+ g4 Z
int main()
: d3 D9 ^6 z/ |  i0 D{
% l7 Y# B! ^, ?        int fd;
. `7 `: p- y- m        int *mem = NULL;% G8 D& b1 l$ ?

! n' M# P  ~7 X! g. o# H        if((fd = open("/dev/mem", O_RDWR)) <0)
0 J( q  G  p: i        {/ v) Z5 b, }! L3 U: Z1 Z' r* L
                perror("open error");# T# E1 o9 G' M" y7 L4 T9 P4 |5 X- E
                return -1;  S6 T" Y" H1 k
        }0 M- W4 W8 g8 P$ t7 D0 E
        * t. E. z& X4 o" u$ P
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 G) s0 R: e2 H* s- a
3 y+ Z2 E* ?" W6 w
        while(1)
4 d/ X4 P0 ^# W. b6 t6 l        {
" S% p0 a( J9 V$ ~( s7 V6 K/ }                read_MSG_buffer(mem);" k5 b9 V8 K, A* n; T
        }               
! {$ ?% z4 j2 I# A9 {& Q}1 W/ B. D- `, m$ {- z
: l5 h$ \( H4 m
void read_MSG_buffer(int *baseaddr)7 [% u% g+ p8 ?, `5 ?6 L+ y  i# S
{0 w4 v1 h# L, `& U
        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 C- V+ y5 G  i' K1 h8 a6 y* \* C, C3 t$ [/ \& J, k+ [* j7 `
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 v" z. w" c% I0 n# G! @
5 |+ n5 A2 D7 ~  n: X- K        if(pshreRAM->packet_cout != count_copy)
0 k$ x4 p8 P" q7 ]1 s# t: {3 Q) D        {  {; [6 G) E3 n
                printf("a is %d\n", pshreRAM->a);
! R/ b: O# K. q' Y( [! W                printf("b is %d\n", pshreRAM->b);: U2 {. U6 w; ]( c" w& b
                printf("count is %d\n", pshreRAM->packet_cout);" L0 M( _& d& A; M$ m
                count_copy = pshreRAM->packet_cout;% V6 ]" r1 {- |( C* s
        }: q3 s! r4 M) Q: @" y  e- i
        else- A3 d5 q0 t( x! [% p' l) J) D
        {' W! F6 v4 a1 i$ v
                printf("No effective message!\n");
4 w( l# b/ y2 I! J; F        }
2 u4 j/ v' Q8 f. Y}2 @2 o* v. b9 J  C* q0 P
" e5 M: I; }' i1 ~
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% d( j4 \5 m9 t' R# |0 {8 ?& }) W7 z! E" h5 Y; E( w" G

- I& j+ s& w/ r% X3 s5 k2 }1 ~) f, X2 D4 P7 [' @
1 F' [& Q# ^1 N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-2-21 21:30 , Processed in 0.040336 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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