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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑   [- V- N+ J2 ]1 k
4 _/ k) B; ?& F6 z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- e6 z/ J) R% s) @% n6 r
#include <unistd.h>
7 m4 b% H% X8 d) {9 [: \#include <sys/mman.h>9 e- u# `6 h5 P' G) d
#include <sys/types.h>
1 p9 b' s( |! ^" T#include <fcntl.h>
# }4 @& ~; ]$ D/ V4 P8 b/ A2 k" U1 |
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
2 c# g' w" q: ?7 t
: {% [/ E) R- N+ W1 g8 Ftypedef struct
- A; q8 g7 G: D{3 Z  A# H- x8 f" u1 G# j
        unsigned int a;
  G$ A0 `  o1 D8 k4 C        unsigned int b;0 U  F+ ~$ e. D- `/ |9 Y5 G+ T
        unsigned int packet_cout;) [% ]5 P1 ^! O) ]0 O$ E* t. Q, A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 M. e  a  r1 }( b

6 i  @( E- Y& n- z( svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 [% G' Q8 m. k1 J9 O
unsigned int count_copy = 0;( k) L4 c4 j: I; u5 }6 k
& Y2 `+ p9 L8 M0 a

$ K) i. w) ]! `5 [6 ]int main()
6 y/ z9 ^$ D8 r  ^! T# _{
+ c& @% D' O* Z$ Q1 a: A9 l        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 \. D: \% t1 S; g        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( E8 {0 `1 a0 y1 |2 Z
# F9 e  I5 A, q5 z$ U2 b
        while(1)& r/ _& Z  }, K8 Z
        {3 h3 A! _  @! D1 N  a, b9 T
                read_MSG_buffer(pshreRAM);
8 [3 G5 s, D7 {8 a4 |* n5 S        }                . ~8 V0 S6 r, r1 m+ `) R
}
- |. r6 {* b7 q$ K; g* L; C: |8 d+ \6 W: o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 z+ f8 B7 Y  |5 x1 I+ }
{  ~9 J. c0 W2 s$ w/ x
        RX_MSG_PROTOCOL buf;( I; c# D; T; B6 e
        + I4 {1 {/ O* w. ^5 C1 z  B
        buf.a = pshreRAM->a;
7 B+ w, S: W5 @) k        buf.b = pshreRAM->b;
  E8 W: x  o3 o& |. r: c( P2 F2 {8 Q        buf.packet_cout = pshreRAM->packet_cout;% m4 y& ]7 d3 N' [' p& {
        & `* m* q- t/ N8 V  q/ p0 q
        if(buf.packet_cout != count_copy)
/ B1 i5 p: p* C        {# f: A- \  Y  d+ t+ B4 H9 u3 J( B
                printf("a is %d\n", buf.a);
8 u& f% f) L- v5 r, K9 S) D                printf("b is %d\n", buf.b);
6 j& W0 @1 r# h1 [$ M  F" \                printf("count is %d\n", buf.packet_cout);
$ Y+ ]4 \) m' s                count_copy = buf.packet_cout;$ l: j5 g  \9 _% A6 e8 y% [
        }5 U2 H) ?( f3 y; ?2 H
        else7 q& B6 `. ~) {: o2 r
        {# T0 m# B" c5 p: R0 N
                printf("No effective message!");' D) L: x$ D; X8 ^( \6 w  }7 t
        }0 @; D& I0 H: R% N* u8 O$ e$ K
}: K$ _/ a  c: d. f! ^; p3 B
2 z4 v' w  {+ d0 @- i& e! b+ ]

, ]; [1 H0 R% U3 N% S1 }, }但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% i1 h% y& L/ |, p! X1 z
使用下面代码,对内存使用了mmap函数后:; [# D0 W! Q8 T% y! l3 L! U; @+ b
#include <stdio.h>
4 T3 L1 F0 G$ r" G& s- b#include <unistd.h>
* q: i4 @5 R1 |. e) ^5 {#include <sys/mman.h>8 ^  Z7 W* [* @8 c5 |% ^
#include <sys/types.h>& H! T) d& F2 S7 D5 M" N
#include <fcntl.h>
; L$ L5 t* u5 ~6 C9 L; V: m: L  z) ^: p: G; Z
#define SHAER_RAM_BASE_ADDR    (0x80000000)7 Q7 h  E8 P1 ?% s/ P7 U
#define SHAER_RAM_SIZE         (0x20000)     }9 i6 v( [9 F) T, P" s" a

$ t. v6 W; U  X) _& t5 Q3 Etypedef struct9 e: @, u. w" e* h# r0 V
{/ \2 ~4 s3 E2 L  O9 S
        unsigned int a;6 n; B$ Y; w' w
        unsigned int b;3 t0 d4 ~; O+ ^! E3 f
        unsigned int packet_cout;
5 N! p$ I& T) {: u}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 w) Z: {- d1 V% r$ }! o' g, }0 Z2 u, Z
void read_MSG_buffer(int *baseaddr);# }1 c/ ~& f2 @! P$ O% {
unsigned int count_copy = 0;
; S; A$ T5 ?$ O% `) f& S4 j
) Y0 ?. ?  N; r; Tint main()6 J5 ?/ a1 Q: t% S
{& J+ n# M# \+ @: |4 f2 }/ K5 K
        int fd;
+ c6 {# q. z3 `2 T/ t2 c        int *mem = NULL;. ?/ N5 M* H0 n; Z5 W2 D9 m

/ y( T5 _3 C# r3 m        if((fd = open("/dev/mem", O_RDWR)) <0)
2 a5 j/ [+ q  S8 A" u5 `% i" ], G        {
  m2 T  w3 E/ p/ z' S$ D+ D                perror("open error");
- {7 T. O' m" i+ D$ f. d1 \0 T                return -1;2 \- D' |$ ~0 |7 s7 r0 T
        }
& M6 N/ r9 R2 {1 p/ H        
/ o* u5 W& A6 E7 b- U" C        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' K2 y" f; K, O6 P

% F( h2 m9 E5 P# K        while(1)
6 F1 j2 E3 n8 |) ~5 C( r) ?- L: ~0 u  s        {5 v% B7 w1 D7 G
                read_MSG_buffer(mem);, i/ y3 {' x* W# M8 l
        }               
1 c2 X2 a9 H7 y}6 T# h/ q, `* I' K) X% a: ?

  k, m& B' d4 R$ }$ yvoid read_MSG_buffer(int *baseaddr)6 u& R! h5 R6 _7 q
{
' f3 o2 w+ @& t6 K        pRX_MSG_PROTOCOL pshreRAM = NULL;
! q1 ?$ D2 y2 q
8 H0 H$ Q% Z5 v  P( k9 h$ E        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ G6 f* W  m8 ]* C9 T- p6 \. s
+ v2 H0 H9 e: z* F- b
        if(pshreRAM->packet_cout != count_copy)
3 Y7 _( h( x; q8 S" c        {
! N; O" {$ w* L( h+ d! l                printf("a is %d\n", pshreRAM->a);/ M2 H( {1 ^( f9 ^, k7 v) Y  i
                printf("b is %d\n", pshreRAM->b);
4 U& E& t. P+ B9 \4 Z* ?                printf("count is %d\n", pshreRAM->packet_cout);) g5 r  d3 Z. k
                count_copy = pshreRAM->packet_cout;2 ~0 A' v! j/ }/ g/ `1 p
        }* B- a+ O9 a& I8 e
        else
- d+ Y9 v5 T) r! c3 v# q" j  i        {
+ x2 ?" g" G: M: Y  k                printf("No effective message!\n");* B1 v% a$ Q8 E  [" N, x) c
        }
) R% g+ w2 T# W$ H; q' v4 m9 `; ]}: D, P. t" o4 v2 W8 d+ F
5 }& _4 q. G( u7 G/ o
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 J! w. W' n: u" C% {, B# i, Y' \' O( f1 V4 ]# G/ l

' Y# {. p; I; t% P/ U( `( Y1 c
. d5 ?; e: W, N5 X3 G" Q  W4 g3 A, s
# S0 K( P+ I0 [9 ^4 R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-19 19:46 , Processed in 0.043779 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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