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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 N" r" V6 o2 D
. g# Q8 E5 r# W  I2 \
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' T& b! j: F; x8 P* e#include <unistd.h>
. s5 d6 W. L2 Z% k; X#include <sys/mman.h>
) `" S( a$ @! h  X6 ~9 @# v& E#include <sys/types.h># d8 Y+ ?% z8 K, J& D: i
#include <fcntl.h>
3 u% X5 ]- B! H9 a4 u/ U4 e+ s5 k. l" a
#define SHAER_RAM_BASE_ADDR    (0x80000000)   1 H% D- u2 P- S. G, H
, k! b4 i5 y1 O
typedef struct) G* o: d6 a# s* }$ t
{% O) N4 V" |& p/ Y% i. y' X
        unsigned int a;
4 z8 n3 z" u# D! O7 e) [        unsigned int b;
/ f8 h( z# r1 K: t5 M        unsigned int packet_cout;
7 `1 G; a# W  T2 \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: W# @1 A1 Z+ P& G. D

( X% ?: G# g0 q6 \5 H6 }/ c. D) A: jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 R9 K! v" Z1 m& ~- Y' b$ @4 munsigned int count_copy = 0;3 k8 R  u/ b9 s7 D
5 B8 V- E7 t. l2 k, ^
- x& X9 t0 m2 W/ R' n
int main()
: z6 u% q) O& v( @{
' u4 r9 i  k' L! [2 w. ]/ |        pRX_MSG_PROTOCOL pshreRAM = NULL;! I. c' I' R% ]; I( @1 q
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( ]. Q1 ^$ ]- ]5 f1 W
7 @8 }, O( ~* Y- @! A8 H; m6 K        while(1)
4 E7 d/ B4 J1 A6 f( x        {
- L+ v0 P! X- I2 q$ V% T4 f                read_MSG_buffer(pshreRAM);
* w, r" y$ C3 [. c% g, }! n        }               
1 z( D/ N& `* i# k: |}
# l# o3 I- w$ |0 M7 r8 ?) i0 b: y, k3 u, d* H- V+ D0 v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" F. s  [. B2 b{
* \1 T6 U4 l; M: Y0 Z        RX_MSG_PROTOCOL buf;& S- a1 H( Y! e) g" M5 U3 p7 x/ q: U
        
" A( M; r3 R# W: ?8 i        buf.a = pshreRAM->a;) \. u+ ]% T. J1 d" u
        buf.b = pshreRAM->b;
( C* j* M+ F/ j        buf.packet_cout = pshreRAM->packet_cout;
" Y- n4 a1 J# p" j  h" \$ S' J        
8 Q0 E% t; O- |5 B        if(buf.packet_cout != count_copy)
# T7 B4 Q) s4 n/ }        {
$ D8 ^  `' v. ?4 I0 |( i, d                printf("a is %d\n", buf.a);# I7 Y  F; h  I' N& b! o
                printf("b is %d\n", buf.b);3 {5 G; w4 ]& t5 e1 h3 U
                printf("count is %d\n", buf.packet_cout);. z& f1 q+ Y2 G; c9 ^
                count_copy = buf.packet_cout;- @8 }" R0 ?8 {9 x+ I. n
        }
0 P* L+ D; i' G        else' a0 U& o% Y6 P( K. I. F9 U1 v
        {
1 w/ ?' [+ B/ V# `' x                printf("No effective message!");* P1 ]3 }/ J) g4 T5 p
        }
" S6 s& [* y& b4 b6 k# @}; }& g: Z; w( U3 l* ]% |

% Q0 B4 J2 z* o1 P! z8 c
! N$ e9 c* C; V0 B" D* J但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  c. s( `2 T( ]7 P5 B  q& c使用下面代码,对内存使用了mmap函数后:
' ?/ _. p0 U$ S# V, V5 R#include <stdio.h>
( I! K! X: W1 i6 g% ]# s( G% e#include <unistd.h>
' x8 K. U8 @2 E# [9 A2 c  f7 [#include <sys/mman.h>! z* e& c4 t' J! q6 b6 y2 l6 U
#include <sys/types.h>
6 ]  c: I. C4 Y6 c#include <fcntl.h>  i- {$ D+ N# n# i: {
* \$ V9 W" h0 g
#define SHAER_RAM_BASE_ADDR    (0x80000000)
: i3 q  u6 X' J' t5 ^#define SHAER_RAM_SIZE         (0x20000)   & `6 L/ |* ^& `9 e
6 i" Q5 h" K( m* ]2 H
typedef struct
0 f- |9 u: K3 X3 r8 E{
! P* T# {6 T7 W+ I        unsigned int a;
! f& y. N* g8 n( P8 d        unsigned int b;
, a1 k. ~2 i% e7 a        unsigned int packet_cout;) Q( u$ c3 c! ?2 X+ A1 K! A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 l& g. m/ [; x1 x$ D
1 I: A; R8 p5 D3 ?: x4 J
void read_MSG_buffer(int *baseaddr);
) v( J) a" P" x; ~% q& Xunsigned int count_copy = 0;
1 Y8 ~1 N. j+ Y' H2 S; j) b
& f% p0 S# _2 C/ rint main()
2 {& Z! w5 `# Q4 c( c$ a. i{7 P2 t2 R; m! C# ^6 u' _, H1 e
        int fd;2 a4 q  A6 L4 N& l# |
        int *mem = NULL;$ R% }! y% p& g+ a
# Z6 ]. [1 c4 H- J
        if((fd = open("/dev/mem", O_RDWR)) <0)
( M5 e1 F' @* T( G        {, N# S2 M' F, V' f
                perror("open error");
2 E. {- W0 C' h5 P                return -1;
- a+ X* R9 j9 K+ e8 m        }
' F& B. r  D# h; l5 u        
' J% ], ]) T# E4 `6 }. G" M* `        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 N/ Z- b+ M+ m+ {: t4 _3 W" a  K: i- t4 Z+ E7 {( ?
        while(1)
# [- l. j* i! }; N        {
* ]4 h7 U. x, I7 f9 ^                read_MSG_buffer(mem);4 B0 t" T" h" n/ {) m8 F% a
        }                4 v' W5 O4 m% @% j. `6 i& Z
}$ `( c& D' o3 w3 S9 r( p1 S/ }
5 E. V+ ?" @% u3 z0 z+ x: B
void read_MSG_buffer(int *baseaddr)
$ a2 _2 t! }$ y8 W' y- ?- Y{
& m+ B  t2 K; d0 A" T        pRX_MSG_PROTOCOL pshreRAM = NULL;, K/ T" j; b2 g

$ R" F. d: _( j: A! p! l        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 A& T8 I$ L; B* {

. H/ D) N" a) h) t4 U        if(pshreRAM->packet_cout != count_copy); n: ~9 ~* v, c$ g
        {. n' O6 ?  }. U7 I
                printf("a is %d\n", pshreRAM->a);
  L+ U4 p. m5 Q( T7 a( }                printf("b is %d\n", pshreRAM->b);8 ^' ?7 c' e* e. g+ A+ ^7 X
                printf("count is %d\n", pshreRAM->packet_cout);/ W8 t$ o& w- N2 U' k$ m) r
                count_copy = pshreRAM->packet_cout;  x. h: N  i( h/ g1 A% Z% w3 }
        }
- P: ~7 O# I( ^3 q, y, o8 i) p        else# M* u( q* K/ |' c" w
        {! N9 ]" }1 B2 E
                printf("No effective message!\n");* n0 a! q& V# h  X0 R; p: _
        }
  N, B# x7 R7 f) F! k# V}3 Y5 t7 I$ h, `7 f- ?5 X% t

* h4 Z+ {: E9 d" r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* Z% `; k9 J2 u7 F7 e' ]- w
5 x5 D* L6 F/ {5 {7 M* V) G8 ?2 R& s1 V  q
+ Y8 ]$ l. ~# L+ p/ h

- ^9 @! B" G  O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-10 18:01 , Processed in 0.046758 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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