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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 h& D5 D; g( L* Y- c8 f$ e* r

( A) r  W: y/ a* W# yOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 v4 v6 T5 F! J0 B0 a#include <unistd.h>0 L9 u+ e( p' L3 G2 {. S5 I
#include <sys/mman.h>
" n# t9 y) N2 B5 [6 y* Q#include <sys/types.h>
; g0 j3 o, ^- o; H5 b- H4 B  j5 H: _#include <fcntl.h>5 S+ \9 w$ N  N, i' }- \
1 {- @3 n8 a4 z0 p2 C6 F
#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 ~8 B" O" O8 @0 U
. s& J: F0 k  x
typedef struct0 [5 H3 ]0 t3 V" T( U: O4 A
{& M- K$ ?0 a: O
        unsigned int a;
! E, v! P  V! e1 j/ Y% w        unsigned int b;
$ _( a& ~6 \& `: }        unsigned int packet_cout;
& _8 c" ~) A& i$ J/ z7 F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 }& c9 K% ~( @& \1 U7 t0 s4 X! Q% ?: Z8 o) h) [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% w( ]/ J  Y' W% c9 V: m
unsigned int count_copy = 0;, {- B& E5 u' N

, J) ^3 z. n/ V/ V, ~' V, q
; l/ e7 ?" Y$ I0 i9 |: X$ v6 qint main()3 ~/ c, S# j& \
{
0 U3 W9 V; |) d: F/ j        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 M7 F( G) J2 Z5 H        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( z( i6 r9 t4 M3 [( b: M8 \9 B% `. k  `* {
        while(1)" q* A. k! y+ O3 z, O) ?% G6 c
        {
( h: X, W5 ^; U2 M0 z5 t                read_MSG_buffer(pshreRAM);
! Z! y2 B- L- f* ^8 {; k        }               
+ o& ~1 J: e) J7 Y2 j/ ?/ c; a}
/ o. \5 J- N! L8 v0 [5 j  ]9 a& P) p7 B9 {) \7 Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 V( v3 o# [4 F; F5 t# H
{# s5 y8 y3 b) p) P  ~
        RX_MSG_PROTOCOL buf;: m& k! j, F9 \$ o
        
# V8 ?/ n" `6 J' w/ k1 x7 V        buf.a = pshreRAM->a;, K4 O% S# a5 ~, e
        buf.b = pshreRAM->b;
4 U* x: W9 }' n# r        buf.packet_cout = pshreRAM->packet_cout;" H4 K* `3 \/ O: |9 f. [
        . Z5 s; V) Q4 P: e& p, ]
        if(buf.packet_cout != count_copy)# _( M( C. ?' U# Q9 V, K
        {
' y4 E5 X$ {, @$ |                printf("a is %d\n", buf.a);& ~- X  l) C1 D/ K
                printf("b is %d\n", buf.b);
; W. F7 [2 a8 k4 M+ U+ F7 b  I                printf("count is %d\n", buf.packet_cout);% E5 G+ u$ X3 }# ?' g' ]
                count_copy = buf.packet_cout;- C& a8 e8 L  k4 r* R
        }5 t/ J- B. h, I- R. W# @; p* K
        else/ `9 Y( Z5 u9 o+ ~+ z3 A( r/ p9 M
        {
; M  F6 p7 \$ J7 ]. t                printf("No effective message!");
8 C9 Y; B1 \7 ~" v( m  m8 `        }, P( E- i1 |% ^# ?- Q) M, {; x
}3 o$ h+ ?8 n% X7 r- V& z5 h/ p
4 T' a, H4 E. d; i

6 y2 o% P! o( W* v9 K但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 B" N. M! W6 v8 x- S% K使用下面代码,对内存使用了mmap函数后:
! h3 p7 o( k# H3 A8 p9 f#include <stdio.h>8 b/ [* t6 M+ D( r8 i: `0 L5 G
#include <unistd.h>
. m# j( I6 n# ^# I+ H' M' s#include <sys/mman.h>/ S; x1 |# |# h2 o: Q* J' U* {
#include <sys/types.h>
; Q& f: x7 i5 R9 H& g/ p#include <fcntl.h>
( X6 E* I! M* p; C0 U) a6 X
7 k& S& P# z; X, @+ F% \#define SHAER_RAM_BASE_ADDR    (0x80000000)
1 a, J. F5 C" V, P9 u* ]  j#define SHAER_RAM_SIZE         (0x20000)   ; M( o# h/ f' t" g

' E0 n# Q, x, l- A2 W, T1 qtypedef struct4 q9 {. O0 q6 E, }
{
& g; ]; _% i# V( n        unsigned int a;
* K7 Z9 P& L  s3 Z, Q5 e: o" ]        unsigned int b;
( b. P8 h* M: ]- H; h; g9 _        unsigned int packet_cout;
' ^6 a2 ~% ^8 k7 x; ~5 R+ z" A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ Y+ o# `! l8 t) O( }/ |9 i8 d7 X# L; [
void read_MSG_buffer(int *baseaddr);
, ]/ m! F. T$ r7 Z4 H" G; }) K( ?unsigned int count_copy = 0;/ L- n( u+ H& M7 J

. m% t. m$ s5 ?( T! q0 _5 Iint main()& x8 ^# y( U, e) \8 x
{) p; l* r  g6 t* v
        int fd;
% R. E. ]  r0 F) [  d8 l! J        int *mem = NULL;
, s% X6 \2 A: z0 l
4 A3 u( l6 ^9 N8 I( k6 g/ E9 o        if((fd = open("/dev/mem", O_RDWR)) <0)1 j( i3 g+ \# W7 A  e
        {
9 T' S4 z/ L# z( ~                perror("open error");
2 K1 _8 n& X. z6 U! [                return -1;  d" ?- H, G7 p9 [! Z& b: ?
        }
) |( [" R/ G8 ]) K5 j7 [& w' t. |        # t# r* b- @( A" ]
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, k0 U1 c( V% L/ n% G9 k% i
9 K2 a# E3 E; F* @
        while(1)
, O- z; `0 B# a: C, P: U        {
5 U% ?% U$ M  o' {7 R- j                read_MSG_buffer(mem);
" k8 f) a4 g' A% b- p, G- F' f2 r        }                # i: ^& V! |- _
}; `7 G: h0 `2 G$ G" G1 k9 u

8 F6 ]( ]+ x  J: s5 a, Mvoid read_MSG_buffer(int *baseaddr)
- X: ~: u+ i- s4 Q; [{
* Y6 }# h8 I; s2 k/ ^9 c1 s        pRX_MSG_PROTOCOL pshreRAM = NULL;, B. F% A/ z$ h: V# H# a
# n$ t6 x) d; I7 g4 A
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 ?  p" x* i' D3 ?8 f9 B. P
5 i" ]; t. e/ S: r
        if(pshreRAM->packet_cout != count_copy). v" r9 N1 w* D" Z2 A* U# e
        {+ g0 d0 k6 _/ L( D4 t. }' q# j4 {
                printf("a is %d\n", pshreRAM->a);
: y* w9 |" x0 T% c                printf("b is %d\n", pshreRAM->b);6 @0 \) q) N8 V. s+ T0 b
                printf("count is %d\n", pshreRAM->packet_cout);7 K8 s, `2 N7 L' R
                count_copy = pshreRAM->packet_cout;
& J; |! f$ q& D. I: M5 j        }- f! K1 S0 A, I( N
        else' Y3 w8 X0 O! n$ X* K
        {! u$ w9 J' w3 q/ ]! o
                printf("No effective message!\n");5 w% @+ u/ o" T5 T9 z1 a- E& e
        }
2 v2 X0 U, v/ _, b$ P}
# N. B# B# Q9 F: M
+ b& ^; E0 E1 a. y- _没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" M4 _+ J0 w+ t9 t; I( D( y3 ]6 o* ~! B6 W! n) G

$ g) w. l4 M" v9 \$ b% T0 B1 q. q" q* b4 a

$ x7 l5 M, p1 D* ?: e* I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-7 21:46 , Processed in 0.041274 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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