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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 r% M' i1 s, B! p8 B; F
3 c' L; P% o1 K4 \7 Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 J$ G( T0 }' I- w8 u& D- N#include <unistd.h>
4 \+ P3 x6 m% O. s3 u#include <sys/mman.h>) M- w% b* P+ C  M
#include <sys/types.h>6 c0 r. \& E8 h* e% y( D
#include <fcntl.h>
5 C9 [3 x# l* Z: M3 S+ d; \7 q
3 Q  S( w! X4 F" N' z/ S. Y#define SHAER_RAM_BASE_ADDR    (0x80000000)   
# d- G; M) z" H/ G
) X$ I& T+ i! K; g" Atypedef struct
, I8 b, a" g) S. ~2 D{
  J. _+ a# c4 F9 L1 e$ I$ O% Q2 _        unsigned int a;
; I% r. ~! d# u        unsigned int b;  V5 H- S+ b8 b3 d+ p
        unsigned int packet_cout;9 J' }; C; H. Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. P0 N5 z! e) ?8 ^' U

7 L2 V3 ]2 B9 {# C3 D# E2 Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( u* b' v2 C% h, r( U1 ]
unsigned int count_copy = 0;6 x! b- o. h! C2 \

0 O* \: s2 J) h; d" t" e# s- y
- v' z/ G  A8 z# A+ ^/ qint main(), e0 \$ j  [8 m  N: i
{
" u) y4 n9 Y+ u/ p; H        pRX_MSG_PROTOCOL pshreRAM = NULL;$ \$ F/ i0 A* J
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( d  b" n1 l4 c% {6 s6 A# ^
: @8 q* P, f+ [* t4 g, v        while(1)' B$ C2 T( x8 g6 h
        {* ^4 Y" b9 G8 L  q- k4 [* p
                read_MSG_buffer(pshreRAM);" ?5 A- V8 r' y7 T2 j
        }               
# o7 N: l% P2 V% m/ R( l* R9 h}  f+ o, J1 G! D, M1 x

* I- M% E% q4 _. H$ _4 i6 Ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ E8 G6 z# y5 k. e# W5 b7 z
{
- X0 [; n6 M) m        RX_MSG_PROTOCOL buf;
: g0 G- Z2 Y- t2 W! A        ! p9 R8 X7 v' c: p5 P& P
        buf.a = pshreRAM->a;
+ h) V/ s2 J- x% J        buf.b = pshreRAM->b;
% g" u1 q8 N+ ?' h  J1 J        buf.packet_cout = pshreRAM->packet_cout;
8 Y, ?* Q7 F+ j6 F- I5 v7 ^        
; a9 B( g6 R9 p4 o0 z        if(buf.packet_cout != count_copy)
* Y) i& ~: n0 G# g% a( V$ g        {# ?6 V8 x8 q2 b8 ^
                printf("a is %d\n", buf.a);% y2 ~  @4 B! R2 z
                printf("b is %d\n", buf.b);
2 }) K5 h( l) m3 P% O                printf("count is %d\n", buf.packet_cout);
1 T9 h; t2 }& d1 J                count_copy = buf.packet_cout;% p* e, u7 w! y& _/ j0 t
        }
" l6 U1 ^( V9 h* e3 L, G/ j8 s        else
; T' h, E: h# g" r- B        {
( H5 i/ L1 ]+ z) b1 V                printf("No effective message!");
' Y$ s) k+ n3 H' ~2 i& R: {1 Z        }4 n2 f2 y6 a' ~4 V, _
}
7 ^) k  b8 L- B2 T9 f" @& q( m4 v& I- P8 I& o& [- Z6 `7 b
  Q3 ]) P4 T( k1 f4 E! V( Q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 p' {/ O! x. d' j! [" [( h4 w* w2 e使用下面代码,对内存使用了mmap函数后:
* k! {& b' {$ q; e! A2 C, b#include <stdio.h>
# x! `3 {0 U. \" c3 r#include <unistd.h>
8 |! Z8 Z) Z6 m( h% A6 h! z#include <sys/mman.h>
8 A& ?; i+ f2 t#include <sys/types.h>
& z8 l* R5 D6 u6 }#include <fcntl.h>; a' l0 t; L% P2 {

+ l$ {( s5 \$ _5 s% f0 e#define SHAER_RAM_BASE_ADDR    (0x80000000)
% c% A* h" ~5 P#define SHAER_RAM_SIZE         (0x20000)     M% z0 M# S: p, Z( B5 Y; W

! p% j9 C& f$ R6 G1 k' j: Ltypedef struct: ~4 R$ n1 i7 \- @: N' W1 S+ M
{
% U2 i4 Q6 b" w0 \) k1 C9 R9 q( \        unsigned int a;
0 R# Q$ O/ V4 l$ s        unsigned int b;
: E4 c3 z/ p; ^0 e$ N' o1 K- k/ F" [        unsigned int packet_cout;
. U1 \) w/ _7 L1 ]4 O; r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 p5 {% Y0 w3 ~. C" [; V& l

0 C  _- I6 M( x* ]) r, ~' [! rvoid read_MSG_buffer(int *baseaddr);5 O: J* R5 h9 P# v4 N6 u
unsigned int count_copy = 0;% a2 Z1 n9 u! L

7 V% l* s$ L, D; T% n) e7 a! t/ Vint main()$ y. [3 Y: w# R4 a( w/ G
{
9 {. k, d; K* N) m( w4 n" [        int fd;3 h  p- v$ F- P8 i6 p
        int *mem = NULL;
/ G6 w$ y# |7 n7 _% Q3 v3 I5 t- h! _+ N) b
        if((fd = open("/dev/mem", O_RDWR)) <0)
7 \0 M5 h3 U$ t! @        {! T5 J7 g9 a9 z( R6 R/ f
                perror("open error");
- v  z% h1 J0 @3 W7 L                return -1;: `- {9 l% b) ]% I4 E) A
        }5 Z  q4 E; A6 O& N; t! r6 E1 G  _6 L* @7 }
        0 i- Q5 ^: z4 W
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* l" E. |9 P2 Y! U+ J3 B; R
8 ]7 G/ c% g, v( u
        while(1): ?0 m3 ?4 d  g+ Y9 Q
        {
0 m* K, N. B2 q* G. o                read_MSG_buffer(mem);% G2 f  z- Y1 S* l/ I$ q
        }                4 a5 ]/ S8 [; {! M
}7 q( r3 `6 F/ Z4 K/ X

; q8 N6 j' c# u9 c2 ]void read_MSG_buffer(int *baseaddr)* h( P& U9 ?. t7 v& p, @
{4 o) W/ ]. ~) [9 s- |! t! E
        pRX_MSG_PROTOCOL pshreRAM = NULL;0 N# ]/ F/ e7 g* L% E: p5 |8 Y( X
. R) t/ I1 k) I5 r( ~
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* T- p0 _8 |/ z6 O& O! r$ K6 n  f4 @; z
        if(pshreRAM->packet_cout != count_copy), N8 ?- a* a5 C- j& @4 L7 w9 z
        {
  ~5 c  k$ ~$ [                printf("a is %d\n", pshreRAM->a);# V8 u5 U: u% N+ g
                printf("b is %d\n", pshreRAM->b);! u$ w, ]! `6 `) U9 J
                printf("count is %d\n", pshreRAM->packet_cout);2 g+ k2 ]% y- t+ j$ I# n( o% R
                count_copy = pshreRAM->packet_cout;( w9 R5 B" i( W" F1 ?; q9 o
        }5 i0 K6 F4 [# [4 @
        else
6 n6 d0 J- S3 m        {, B5 w( S# a0 Y  ]% X
                printf("No effective message!\n");
7 Z+ X$ ?( ]! n) ]1 z/ v# g        }
. v6 r" G" D) I" K* c8 \+ ^}
) J) B. p' }% P" j& ]
2 _, N3 E- [* f  e, C. q3 ^; l没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) Z8 ~0 Y. [+ R9 H( S; R9 B0 g! |: a2 e) C! }$ C
' w# Q6 x2 V$ w

% }  S6 T8 \. k* z) P- A! _
# q( T+ k  w2 s6 j2 I  y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-26 06:30 , Processed in 0.043913 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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