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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% O4 q/ N9 `  X/ f% D& s# {* F) j# h1 ~" f
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 ^" w- l% H4 d6 P& f
#include <unistd.h>$ n5 T* o, E, L% J& V* p
#include <sys/mman.h>
6 b+ x3 Z1 x0 G' k. f8 Z0 t! S2 f#include <sys/types.h>
8 g0 B0 r3 r% Z& t* v8 U; R#include <fcntl.h>
9 m* w/ F8 ?# l. K% |+ r/ M+ s8 R
& N8 ?5 Y6 f5 o) o+ ~' Q- Z#define SHAER_RAM_BASE_ADDR    (0x80000000)   * I1 S( K/ Y7 p& K4 c

, I9 I$ b7 Y7 S4 Wtypedef struct/ F& K/ s4 n  p' o# s
{
) l1 E( G2 s7 y$ E        unsigned int a;
8 H& Y2 C; G! u        unsigned int b;& I6 N/ K# g3 `! u: n) \& w' n0 I
        unsigned int packet_cout;
5 W  K+ ]- }! {$ V1 E8 Z% S}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 B; z9 N8 ]6 a' T; Y: X4 s

& D. Z4 `% t/ ^9 I! k2 W. Z4 Vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 ^3 f) ^# s  C2 o* J, z/ f
unsigned int count_copy = 0;
+ `. a# r% ?# n2 J  z8 v" @" W
3 |, `/ q% b- W
( [5 `  t- g7 S* Sint main()0 J5 u) r. \9 n1 A$ x& I
{- P. V: F2 D5 B9 i- C
        pRX_MSG_PROTOCOL pshreRAM = NULL;+ T, V) y2 T) E2 c1 ]
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" s% g; T, j4 S3 r! ]; u+ W$ f) Z* Z
        while(1): S, o" V6 Q2 x6 m+ X
        {
! m- r# x; c! K' h1 v" I  h                read_MSG_buffer(pshreRAM);
) ]% G( k3 U( N3 ]+ b! o8 |$ s        }               
' T) {4 q  E& J" D7 E}' C6 A$ F, v7 |# I$ [
0 c- a/ H, p* ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 _% j& L7 C/ e  C" g% K- n
{; r  Q6 K0 {2 G
        RX_MSG_PROTOCOL buf;4 v) D( y2 q) _# q
        
! j4 c/ Y! g7 F8 F        buf.a = pshreRAM->a;
* e  \' I3 [0 h        buf.b = pshreRAM->b;
9 W- q& F! N$ C        buf.packet_cout = pshreRAM->packet_cout;
1 `' F5 D; ], |* f/ c        
5 n; }: z" v# v. g0 q! a) p        if(buf.packet_cout != count_copy): q- n2 a5 K( n' ^; g
        {
) ~* x0 {& f) N# a( o                printf("a is %d\n", buf.a);" Y0 Y+ E6 c) y  _
                printf("b is %d\n", buf.b);: G% F4 U3 T* E
                printf("count is %d\n", buf.packet_cout);& G9 X" U8 P4 d$ Q- c7 g
                count_copy = buf.packet_cout;
# {, c( B. e/ z' ^3 I1 a: z        }5 l0 w, r$ r. C# }4 ^( \3 o
        else
4 f1 O( l% b  L; S0 a4 C        {/ `+ d9 w) R  O* b6 G* y# [1 f. ?
                printf("No effective message!");
, u5 q, k* `9 N. C" }        }8 S4 i6 n7 M$ Q  J
}
. d, ^' S- z+ t) ?$ R6 D' H! b' M& \6 k2 O! V2 C0 U

" n) D3 @* r) t& |但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 |- z- |7 ~- L4 [) q7 j' _( e使用下面代码,对内存使用了mmap函数后:8 _5 N7 I' ^9 I& k
#include <stdio.h>! R3 c6 p4 a! X" Y1 x1 t
#include <unistd.h>
( A, n" a6 V" J& _5 r#include <sys/mman.h>
. \2 g7 f) ?5 s# K  \* L+ [#include <sys/types.h>
  T% v7 n2 O" v: B  `: z#include <fcntl.h>5 z  B8 K0 _+ w2 y5 a* I
4 }( w5 [/ ~9 V$ ?3 u# M
#define SHAER_RAM_BASE_ADDR    (0x80000000)3 x, n2 V8 |2 P) g( U5 R
#define SHAER_RAM_SIZE         (0x20000)   
! z# l; K, t/ X$ ?$ j0 R- k. [" v  s
* W0 T( a' Z8 N5 v- E' b3 W! itypedef struct9 w& _3 r; c# A- G
{$ c) F& J+ {& e; v6 B/ F
        unsigned int a;
+ @+ n" R  x6 W2 R        unsigned int b;
7 {3 h  \3 S) w% R7 y        unsigned int packet_cout;
  y2 t. O* h5 r  ^2 f, Z2 I2 a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 O# o( I9 c1 F9 N
, r! _) I- X! T2 R+ [void read_MSG_buffer(int *baseaddr);
; `1 I2 ^/ @- ^0 O8 h: sunsigned int count_copy = 0;8 Z7 {5 A; T4 b$ J5 E2 z5 P

4 m4 N$ A+ R/ Y$ K3 Pint main()4 V$ X( J( P) L8 O! q
{8 `/ D) P" G9 a; q
        int fd;
6 m5 \4 ]2 a9 j1 O: \        int *mem = NULL;
+ s( f- v& M: k$ E2 y# j5 Y; @4 l; d5 B
        if((fd = open("/dev/mem", O_RDWR)) <0)
" a4 v) h, ]( [0 S7 |5 V- _        {2 d. Z: X3 s  P3 v8 P
                perror("open error");; e" o; Q. v. a2 z
                return -1;
7 Y& D: E+ m1 T  g* I8 I6 T$ s        }( J- B6 ]' e# |
        
/ I3 V! D. C- t5 R; I& @        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ K% F* `4 N6 w! A( d2 W
' J/ e" R% p3 l& i        while(1)
2 \2 l" r2 T" g2 a. U2 i; ]7 C8 A        {
! Z8 q, @; d$ k* A  I                read_MSG_buffer(mem);, T2 i0 [: \9 ]6 }  _6 V2 z
        }                ! T" z4 q" T4 `- J. D. f- U
}3 e( L1 x/ g8 B% P# m& c

4 h" S4 r+ X+ M, f7 Dvoid read_MSG_buffer(int *baseaddr)5 @: q' ^% J  d- q. L1 O
{. m, L' S$ G! v3 y6 ?/ D0 Y3 o0 Z
        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 `) J3 X4 }* `0 H
+ n. s+ K" p! V2 T        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: i' }5 ~# e' J0 N5 j7 t0 l

" |, u5 W) ~" O7 j        if(pshreRAM->packet_cout != count_copy)
0 B+ G9 b8 c& X" }1 j: F' h        {! B( w8 w  m1 U" [: V$ O& `
                printf("a is %d\n", pshreRAM->a);' T, G1 j0 J+ z8 ^
                printf("b is %d\n", pshreRAM->b);
1 ^3 A0 J! a: O& U' x                printf("count is %d\n", pshreRAM->packet_cout);& b7 I( a3 n1 l
                count_copy = pshreRAM->packet_cout;; u4 s2 T, ~+ R) p% [1 M+ O
        }
0 X. T! |$ ^- a& G% d/ L' M        else
' b, I# w6 i- D! x        {
% `8 a# K! m' Y' |; \1 ^                printf("No effective message!\n");
! `6 A8 I! n9 h7 j: }        }
2 @9 o1 |1 A. x}
4 n  H# E& j- \# J9 y# J$ S1 ]% D3 c: ~" x) I% b+ C
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 _% {2 r( E4 b* w4 H" v0 e, @6 \
  T/ s0 r" c6 l: h, N$ ~
# j" F; x5 }% @. ~0 _

: S% g# E4 o, S; v+ C) p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-1 14:12 , Processed in 0.038604 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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