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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ; F% @( |8 q& Y; N- D5 b
5 `( A5 H( _% @# _9 j
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 A9 T; B7 [$ B) l' ^) _#include <unistd.h>! @: l2 w2 V' P' q& I0 D
#include <sys/mman.h>" g# Z) O" @6 w) P
#include <sys/types.h>
, e! R' x0 h; {( i$ d3 x; s$ Y#include <fcntl.h>' p8 D8 F( \# U+ q$ T
( L7 J( y& W4 a& K) F: H. s
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 u: n+ @, L' Q; H; G  _/ [: u! t9 l" J. e
typedef struct
, W4 s$ B. X5 h$ M8 L6 X4 Y9 n8 P5 o{9 f8 w: a% Y4 Q) J; m' P9 D
        unsigned int a;
, ]% p7 a' N6 N9 n$ Q        unsigned int b;
$ N& @( |' N( E' a        unsigned int packet_cout;
& U* s2 S! Z7 L/ |' t1 d. g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! d8 N. U! f  U! ]$ P# ~! Q# ]  r  Q9 M- N+ Q% ~+ r- ?$ U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 B9 D8 e: H+ J  O1 T
unsigned int count_copy = 0;
6 V' [; Z1 l/ D+ I# s% \& p* i; \5 Y1 \
1 `6 J" C' z( [% p# w; ]6 ^
int main()
; A( f5 B6 i, Y{
+ @9 a" C. @+ Y1 t0 b; C        pRX_MSG_PROTOCOL pshreRAM = NULL;. V$ t1 ]% b( l; B8 Z" F
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) O! f/ I% `) @& }% y( D
3 d; D/ u# w- D& f( U) k! R
        while(1). N3 }" k& P1 g- y
        {- i% }4 F; q1 c- \( l/ U
                read_MSG_buffer(pshreRAM);
9 W  M+ d+ k) D' |        }               
, X/ P2 h, `8 k! X4 G- s# F! j0 P6 O" b}. a2 P8 [. ?8 H: {2 a. O) g# a1 _
. S. D: N* Z* q6 \# v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( P, z# c$ J% Z7 m{/ n- e$ u7 k( t0 D, D7 W6 J. f( [
        RX_MSG_PROTOCOL buf;
7 u4 _5 T, b* A9 Q+ F7 i; H0 L+ x        
' d( l7 z; z9 o        buf.a = pshreRAM->a;
$ b2 P% L2 E1 l5 ?) M4 ?% o        buf.b = pshreRAM->b;
# B5 d) }) J$ G/ f        buf.packet_cout = pshreRAM->packet_cout;. q/ `4 L. A/ z; w; m* s
        6 a) z8 L- A& R- [1 N; ?0 A
        if(buf.packet_cout != count_copy)
- Z1 k3 S) _4 ]" b! J# w. X* O& e: h        {3 H5 k% S1 a& B( O% ~3 ~
                printf("a is %d\n", buf.a);( E/ p4 z3 B% e# i
                printf("b is %d\n", buf.b);
  n/ V- ?' j* c3 F  x1 g                printf("count is %d\n", buf.packet_cout);
% x2 \8 ~* K! U" A& v0 M                count_copy = buf.packet_cout;
) R0 J) Z4 J9 n' e        }7 F4 [4 }, @2 t+ @
        else9 e: S" x0 e4 W0 g# u- B
        {+ B; N4 M. a$ j- b+ J
                printf("No effective message!");8 o0 b8 A5 v4 s' \! _
        }
$ f1 c; u0 X: s! w: }0 l}
/ t9 K% Z& t8 \0 \4 T( t! B0 K2 y" P4 G

# |/ t' K' m( J7 @* |4 F& o$ c" i但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" l( L. @) a8 X6 s/ Q使用下面代码,对内存使用了mmap函数后:! G: a% L% p9 i; t$ @
#include <stdio.h>
, f6 m) ]! ?- X& P. [! c! |& ?#include <unistd.h>
" V% w& E9 S6 f#include <sys/mman.h>
% P% `7 p* w' a0 B#include <sys/types.h>2 w0 w' D6 U. Q
#include <fcntl.h>
: P, D  Q$ }/ e* A
5 Z, l$ q. D! ?3 t) N, ^#define SHAER_RAM_BASE_ADDR    (0x80000000)0 s2 W' I& L- C: r' l
#define SHAER_RAM_SIZE         (0x20000)   
0 \8 H: A2 ]3 t9 ]
5 ?: N4 N' ^' X4 J9 U# [. Itypedef struct
& T( K1 a$ ^+ \2 e- D& C6 l{
0 W0 B( I0 i2 m" I" \        unsigned int a;2 E9 V2 M: z% _& G0 C: N* Q
        unsigned int b;$ F* Q5 Q" E% R  i  ^* S) ]: v
        unsigned int packet_cout;2 ?( a- L4 X  ^/ X/ K  e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! ]4 O6 }- P' G- e
8 v8 w9 [" w- l5 u& ovoid read_MSG_buffer(int *baseaddr);8 ?2 {4 ?; R0 x  o
unsigned int count_copy = 0;
% g9 t3 U  u$ m+ o/ L) N$ ]2 g( U- F+ |( P, }! t6 j5 A/ F) ]
int main()
% P7 o, f( `5 u{3 B% L. j7 C* Y+ m
        int fd;
/ b2 t$ _  _* }2 {        int *mem = NULL;
3 g+ s: K2 t" j# h$ L/ t+ y, v6 q$ N* e0 y+ U
        if((fd = open("/dev/mem", O_RDWR)) <0)
* A: L, `- E9 l$ ?        {
: R6 H3 \2 z2 d7 U( D  Z- {                perror("open error");
$ D" F3 y8 W7 g2 _4 G. d  f% Z                return -1;
2 Z, n9 c1 }6 A6 ^- P        }  A8 c6 R2 ^  o" W
        : E" |3 Y. n. g& B+ n, @
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 Z, r# E5 Q2 G2 [4 S

" X7 F2 H; `) O: B& c9 X  @+ F        while(1)/ b8 O" D: l/ g% k" N8 @% z
        {; ?" {5 T, H2 h" E: E
                read_MSG_buffer(mem);& O% M" }+ g- R( i" z
        }                3 i" Q# C! t9 ^- b! ^/ x9 _
}1 k/ A3 D1 W+ n+ H3 C

$ j% x: b3 z% K% d: B5 y8 @void read_MSG_buffer(int *baseaddr)( j& f. K5 W! C$ B
{
6 L: E9 h0 N4 K, w  d; I# F$ |        pRX_MSG_PROTOCOL pshreRAM = NULL;! @2 Y6 O3 y) M# Z9 a7 ?
  q9 I: M* c& i
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- F: d3 w( }7 T4 |1 O( A4 F$ W7 n7 T+ i
        if(pshreRAM->packet_cout != count_copy)
0 ^8 l7 S0 W8 b! y9 I3 \* F$ j  ~        {" v  q+ C& @# x( i8 t/ S6 V# A
                printf("a is %d\n", pshreRAM->a);. G# ~. b( i5 T% X1 Q) Q1 A
                printf("b is %d\n", pshreRAM->b);
7 C6 |! p1 h/ w6 B1 }                printf("count is %d\n", pshreRAM->packet_cout);
6 L) q2 w  d4 q- M4 k" `% X1 R                count_copy = pshreRAM->packet_cout;) j, e. b/ T8 }8 s, {' {  I
        }5 _# |1 G6 x' V: D
        else2 {7 _* L; E2 W- T( Z/ ]
        {3 M& l# ~% D  g/ D) a5 c
                printf("No effective message!\n");
- @/ N1 y0 n6 h6 m3 Y4 x8 {- R        }
% h0 M5 X$ f% O) P1 y, b7 h% w}
7 U$ f$ K; ]* i7 w! ?" o: v! c
* S+ [' j  l- z% f9 {, }没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( K' }) N) @) }& H: }% Q8 D$ z# W) d9 G8 e' G+ t' ^

! ~. d, O2 Y! s$ A+ n2 V5 G; F
8 |8 s; q4 V. g7 T) h2 Z
) f9 w) m1 C# r5 j$ }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-5 10:05 , Processed in 0.041525 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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