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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  T' ?7 L3 h! \' a" G/ y7 Z
0 U# T* p- {7 y* V& o9 A$ Q/ [* _OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; k1 ?4 _6 B5 ~  V
#include <unistd.h>; W/ m$ W: A: H$ X& x. y
#include <sys/mman.h>
4 q- P7 b$ V) a4 a! |1 i  l: V#include <sys/types.h>, b  P6 W# v! Y1 H" F# H; h
#include <fcntl.h>
2 B; m+ D1 _+ R, S& K
; {/ ?5 k" y1 Z5 Y: U8 Y: ]" S#define SHAER_RAM_BASE_ADDR    (0x80000000)   : f% h2 W% k" ~

2 m' ^  P. }* Q4 j  Btypedef struct. w' ~; x* B" N
{
7 Z3 l" Q- r2 M' l        unsigned int a;
) I6 G8 @* k- M3 _8 _        unsigned int b;
8 @5 l) e/ _+ ?( ^, S, [/ i        unsigned int packet_cout;2 B( C/ }8 k4 B% W  L* o* N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 P( i3 W- c$ g5 u
/ k4 X5 V' G0 o* _9 w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: a7 C9 s6 w0 b5 ], _. O/ ?& C, j+ wunsigned int count_copy = 0;( W5 ?6 M& F# v% v% q6 ]
; t6 P1 Y/ r; `3 P! X' w6 I; n

  j: ^" s) w  J1 f/ S4 `" V2 Y% gint main()
1 b5 c1 H7 j- y) j. s{
( U  I* d7 g5 q        pRX_MSG_PROTOCOL pshreRAM = NULL;9 ]1 R! i* X3 l+ a
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 P2 U( r" `1 w: `4 B1 V9 K+ @1 D
3 R' m; R/ a' Y3 B        while(1)
  P; \- S0 k+ S) O8 j. }5 G% A5 u! N        {
$ B1 |9 p4 u0 v3 x                read_MSG_buffer(pshreRAM);6 V5 v* Y% L; w8 T* B6 G/ }) ]8 }( w
        }               
7 M2 Q) M* c% u% `: `! c3 \}
# R6 h& S5 ]$ Q3 M  d- D; ^
. z* u# s& y4 r, Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* o9 X8 B" t) J$ @2 ], z4 ?1 Y, B. V  I
{
5 S: z6 H+ K+ H  \& t. z0 O        RX_MSG_PROTOCOL buf;) e9 F" x- a2 I2 i) X
        
+ F* ?" q- v, Q$ n0 f# i        buf.a = pshreRAM->a;
, m9 P9 ]% b9 L9 h5 v) V        buf.b = pshreRAM->b;
% d/ e, I: R" I" W/ P        buf.packet_cout = pshreRAM->packet_cout;( w0 H, H, _: h3 B! e
        
& {6 b4 ^. f- c' d$ `5 Y  E$ f2 A  {        if(buf.packet_cout != count_copy)
# z5 x* Q' ?; L$ N        {
7 @( Z( [% K4 n  e# g                printf("a is %d\n", buf.a);- O" D9 h" ~; F' t
                printf("b is %d\n", buf.b);
4 J6 s# `2 m# k1 n$ Z% u& Z                printf("count is %d\n", buf.packet_cout);
; ^' V8 L  L3 }- f/ G, ?* T+ p                count_copy = buf.packet_cout;
, s' K4 b- C* ]0 \+ a! g        }
" M" [9 ]5 }6 J        else
4 ^: S. o7 }& ~1 Q1 j9 D9 V! L: R$ K        {9 m, A0 F) @# f, I7 g
                printf("No effective message!");
3 F9 x9 _* P, h6 P9 c. i( Q        }
! }) M0 T- s  O; r# u& I}6 J: g$ J0 [; j' G/ c3 q8 U

6 E4 U1 b5 k( l* L5 D
: x+ s  ]% X  H5 X! J, h- b但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, |3 ^% l+ ?( i& H* }# J使用下面代码,对内存使用了mmap函数后:
3 h  |( r3 Q( p2 a5 u: l#include <stdio.h>
1 ~7 \7 S5 Y( s6 [#include <unistd.h>
! R2 T3 t3 s/ b" j' j#include <sys/mman.h>
/ r1 D: Z& d, S7 O#include <sys/types.h>8 Q9 u1 g( s/ s- H
#include <fcntl.h>7 w+ v/ T  T1 X% y" x0 h3 K

" j$ o- T% a* {& E  L) \#define SHAER_RAM_BASE_ADDR    (0x80000000), ^& {* b5 j, Z# @( z4 |
#define SHAER_RAM_SIZE         (0x20000)   
/ B1 u7 k, T1 O) O2 ]
) {* S1 K6 J+ }. t+ T9 \! ?% v8 etypedef struct
$ _  u4 e8 V) l, K{
: W0 d9 d& B+ n1 Y9 R" W        unsigned int a;2 L4 O+ r/ L( k( j0 k# [
        unsigned int b;
) @5 Q+ R4 E4 E2 f3 ]# k        unsigned int packet_cout;
" ?' e( O  J7 g. D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 S; c* z8 K/ w' N9 ?' h6 r- T; r$ \- L
void read_MSG_buffer(int *baseaddr);
' N( Y  k7 G; gunsigned int count_copy = 0;
) T+ @+ p( U' ~8 E8 C
# s8 {3 I8 k7 m' P7 m$ g  H8 Kint main()
* s1 \7 V) \; I% g1 o- E{
6 m. I% \& n2 m, @( R0 `5 a        int fd;
9 Z2 C' P* g4 a) v; i        int *mem = NULL;# {# ?) x) ^9 u7 G8 H- l
3 l1 w+ @2 T% F7 g; K/ ]
        if((fd = open("/dev/mem", O_RDWR)) <0)
# T1 m# x: Y& R. a: ^& k        {
3 e; X6 q1 a. B( Z* A                perror("open error");
% Q+ q1 [. F! ]. ?$ K# i                return -1;
  B7 O6 ]1 c7 j  O% D% ?: `        }
1 A' E" x- o0 B! V" k& u        
. S$ L3 d! _' t* e1 }! y* W        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);5 @4 ~. y; X) s; ~+ s. G
: i6 C6 W/ k, r
        while(1)5 W: N- D1 K6 P$ O
        {
+ f3 P9 L$ g" U. p2 X                read_MSG_buffer(mem);
( b8 X" Q: M, k* u4 D/ |' ^        }               
/ \; r" Q1 a" B9 w  C8 @}
- L0 t/ `8 I4 U4 p. c* a6 j. V$ z( {  q* {5 E
void read_MSG_buffer(int *baseaddr)
) G. H2 _7 V) E$ ]{* |  Q0 U$ f! B+ a$ F
        pRX_MSG_PROTOCOL pshreRAM = NULL;) U  Y0 @8 B5 q0 T. e

( J8 [8 m! g! `+ J9 C        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% x9 W0 j" x* N
* Y6 _- A3 i% p' F8 z* O        if(pshreRAM->packet_cout != count_copy)
6 J% H% u9 L% }+ I8 x, n        {
3 ^" |+ q, w! E! ?5 ~                printf("a is %d\n", pshreRAM->a);
! A/ I. `, H' N1 c, i4 o                printf("b is %d\n", pshreRAM->b);0 H6 [2 ]- n5 j( r+ E  z
                printf("count is %d\n", pshreRAM->packet_cout);
, K# |, o9 F8 X3 J4 }: h                count_copy = pshreRAM->packet_cout;
! B7 `1 M4 t* C8 e2 \        }- |- _5 ~% m' ?' b, w7 n$ c
        else
. `! ~- U; c4 o( V" ~        {  J  i3 a  T$ F- c: Q
                printf("No effective message!\n");0 W2 e* i9 v9 U
        }
, y7 |( p* `2 y}& \2 q$ j- E6 t' c" K# z0 A
6 l, K; Y6 k! {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; K7 Z2 i- u* b1 W
% s% e/ m6 d- s- Y& H. q. z
1 B4 A0 G3 E1 p7 w- R9 Z7 A4 a* r$ g9 N6 X/ z  C, Z6 F) [, z
9 I4 F, N, n) q$ N8 N4 }7 _9 j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-10 02:28 , Processed in 0.047548 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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