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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 U7 D. H4 H, s9 u
# H7 `! i' t3 }; J3 G# a0 F) |- n3 ZOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 r6 \& C2 \9 A* H; L: p- L#include <unistd.h>
' L* Y, a) f: G+ `0 j( n#include <sys/mman.h>
  E7 _" S4 {3 _8 h2 j; V#include <sys/types.h>
5 c7 h  ~+ f; d% y' ^8 A5 q#include <fcntl.h>
) s7 x- ~; ]3 E4 D( O2 X" m; Z
* P8 b( T( g2 B- g! U$ }1 X1 c#define SHAER_RAM_BASE_ADDR    (0x80000000)   
+ n# `; x! w$ X( W' t3 W& {# G* ^* Y) X( Z  l: M' h: w; [' b. }
typedef struct
  ~+ S! N% o8 M( U. e% y{# J' p) ~; B' V( x
        unsigned int a;
! q9 f7 ]: X. L$ |- [: g( G        unsigned int b;
. d, E! C  x1 H  h# N1 X, U( ~        unsigned int packet_cout;
3 y/ s( d- `* `0 f/ `: @6 ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) P7 T8 h9 w% ]5 D- Q+ D

/ k9 ?# ?' W5 s" ?6 l2 yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( W" Q) M% s5 g2 _% i2 dunsigned int count_copy = 0;3 L. h4 |$ m- i, n' q, R/ h

- g  }+ g2 l1 M3 F: V
& Y, c  u$ b; U7 J9 @  {$ Q9 l" g1 ]int main()
) B0 u! Q; u# T6 H( S& H8 q" C{
2 j# i" X7 N9 c9 R  V! m2 |        pRX_MSG_PROTOCOL pshreRAM = NULL;' d2 m# W6 q2 F" e- D; U! |$ P, d
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 X% n- @: s7 p) D
8 P; L  i; E2 M& J6 ]' c- ~. z        while(1)$ C9 @% H! U7 H9 V
        {/ A) O( y. s$ ]# O8 Z
                read_MSG_buffer(pshreRAM);
- @& ?/ T0 U# w9 ?& E; c        }               
7 B! l$ N7 Y) m: G3 w: O}* m/ @& @" Y; Y: ?, A9 d1 {2 Y# Z
4 k( y" U+ J# r' c/ B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), y# k) m! z8 s# }9 k
{
, s& `! H4 A# Z7 m% x2 X        RX_MSG_PROTOCOL buf;
) e  ?; ?& P) w1 l/ u$ D+ E, r        
% x  ~7 {) y+ @        buf.a = pshreRAM->a;
/ s4 \% Q2 p. o        buf.b = pshreRAM->b;% F/ l! _- X  D1 D  m& c
        buf.packet_cout = pshreRAM->packet_cout;
. E" d; Y4 F- {. t; j/ v        
! n! S* m; S: B. M- R        if(buf.packet_cout != count_copy)
* w3 f: Q/ h0 H7 q# [! [. U        {  ~0 {9 n0 s6 A2 X/ t& q  t: _
                printf("a is %d\n", buf.a);$ e: R) m! P7 R/ `; L& U
                printf("b is %d\n", buf.b);
6 |  v+ S+ I% l# f$ T                printf("count is %d\n", buf.packet_cout);- w- D( p4 ~  z: b2 @
                count_copy = buf.packet_cout;) _( D* o, ]) c2 m! l( K3 M
        }3 d3 b0 h) t* [; I4 ?
        else( y6 l  G; i+ ~9 H/ i
        {; |3 D% v* k2 {
                printf("No effective message!");+ S/ Q* N, X( y, g* W& I  ~
        }
3 O) h$ T+ S- N. W& V( W9 c1 ^}
; a# q0 V8 f, a
) n) Y2 J! Q0 x% u' [( }" A, ]) e, D4 s1 h: Q1 j
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ N. e& R9 A) v' g( A5 ?使用下面代码,对内存使用了mmap函数后:+ S5 u  B# o1 N0 A+ T
#include <stdio.h>5 W1 m+ c2 L; v* f9 M% Q" `
#include <unistd.h>) N7 J) k$ O! h
#include <sys/mman.h>( a) U7 b, z  o3 w0 u& G1 J
#include <sys/types.h>$ h& L* x) \- S. {' v7 j5 {. z  D
#include <fcntl.h>% c) l% b$ G  \2 P  c

4 [( A% y& T+ b+ s9 P4 u#define SHAER_RAM_BASE_ADDR    (0x80000000)& P+ U4 a% X3 e: Y8 Z: M4 ~
#define SHAER_RAM_SIZE         (0x20000)   0 X# X: S" S! F+ n

6 X  j$ r% y; jtypedef struct" O, S0 W5 ?# Z7 D+ `1 @
{# f* o: N9 @: {; I: y  E7 D
        unsigned int a;
! i( E" p/ l& M        unsigned int b;, L5 ~6 V9 G* H) h) K
        unsigned int packet_cout;- e) l0 ?, z% j# p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" g5 ~* h2 g1 O2 W6 ?
# G5 U+ o% e5 V1 C9 J% }* @* g9 @void read_MSG_buffer(int *baseaddr);( t; i8 \/ k' _) M3 [
unsigned int count_copy = 0;
  ^8 g- j2 E' U+ B! h  t
$ r3 G. y* ?" P  Q% Cint main()
* a1 d. u; g# l3 R3 N{  B( N3 V* p/ {3 U, {9 ~  n, B
        int fd;
5 ]% M( [# U5 j8 w) K        int *mem = NULL;6 E: g/ L; ?  _

" S* _. `3 \0 e; ?" q        if((fd = open("/dev/mem", O_RDWR)) <0)
) y: P9 F# A& O: M" r# ^        {0 a8 |4 ^; v4 \9 `
                perror("open error");
6 G9 V! Q9 s3 k, C' a- z                return -1;
- m+ ?5 E7 u  o2 ]        }
4 `% z3 C& p6 r; z5 z+ I        
" |- x7 z9 P+ w& k; B        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' U. u+ J$ z& M: s4 c2 x
0 S) Z) K2 ]5 |% E+ G0 B: U
        while(1)9 l2 j' M* X- \' _9 ^! N
        {0 ]( I- d+ j- Z0 Z
                read_MSG_buffer(mem);- h1 S  L7 M+ c4 i7 V# Z# t
        }                8 g  `1 D' p9 Q8 S5 Y. V' ~* l1 l( N
}% N* y, s- p9 I8 s0 U$ V4 J, [% l$ E: U
6 _# J' z" I; z2 S( F/ e  G
void read_MSG_buffer(int *baseaddr)+ S. j( ?% l# p' P# q
{# K6 Q+ ^9 G/ p" y( j8 p3 y
        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 w  C$ d7 g! ?: @2 A9 U( W& p4 O6 w+ J
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 y4 g  X1 O) }% Y+ {. p
4 P6 ]% z1 {/ j1 s+ e2 O" ]        if(pshreRAM->packet_cout != count_copy). m- `/ p2 F: }$ x6 I% s, [
        {( k' G- V; S4 N: L! V
                printf("a is %d\n", pshreRAM->a);
' x8 s: L% r7 H+ ?  U2 ]% M. c4 G                printf("b is %d\n", pshreRAM->b);& n8 @5 O5 s2 i6 L/ ^
                printf("count is %d\n", pshreRAM->packet_cout);, y7 T$ j3 ^' Z3 B# u" W* n
                count_copy = pshreRAM->packet_cout;: o" _, A, F& u
        }: T* _9 g/ s( Y2 W: ~8 O
        else( T" Y4 G" Q( |, g7 x6 J1 n# k
        {
9 G- w1 G3 r- r, h3 H                printf("No effective message!\n");
/ Q; b1 i. g" \8 n/ Q4 K7 \        }
+ J. Q" L2 @- Y}
3 H( y0 P7 `1 n* O* f8 \# B; o3 z/ L6 S( x; q& Y8 B4 D1 A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 h6 f% x% @# P7 i. X' f4 i- u" T" \3 i* L# e& A
* O5 e' S5 X2 P' \
! ^1 J" y! S+ j! g+ x7 L6 U2 ?
" |# k7 [+ b! H0 m1 M8 R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-9 11:11 , Processed in 0.045692 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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