OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" p) e/ X$ ?6 r& B* A6 E5 i" |
! T9 P; M7 T, {; B6 E$ O( SOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ I2 |' O7 _1 O& q
#include <unistd.h>1 C/ Y7 w) x, M" O: S
#include <sys/mman.h>
! Z7 @! t5 x- T' B- t0 M" ^% k#include <sys/types.h>
! ^7 V0 i1 M$ w" {  b#include <fcntl.h>9 O+ n# h& u) M2 s  F0 X4 ~1 V
1 v; S" Z2 k# E: {" {" _
#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ d0 R0 {/ s; F4 G8 D

& L( U+ \% T, e( _# }typedef struct
( I  I* o/ l7 Q' ^0 D( \{  Q6 u' F# s' R7 k# n
        unsigned int a;
6 K" ]! r  f2 i+ @  B        unsigned int b;
$ ?" a' Q, Z. c        unsigned int packet_cout;( j* j5 C1 j# L* H6 _0 P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 E, O4 a/ }8 ^& B* A4 L* r5 v
. o. @8 `, U+ G& tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 R, B1 T. }( I- q) Runsigned int count_copy = 0;
" ?, Y9 ?5 D# g6 l
, x' U. h+ s9 F% S! j% U
4 t9 i& z* y( U! n2 n; Tint main()$ Q$ |: z/ X0 A3 Q
{  X7 ?3 b$ U& @" i, Z" \# b* C
        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 `- u6 C% c  K; A# }" ?        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ [. Z' v+ y1 v: E( c9 z1 q( k1 u9 Q0 g5 |
        while(1)7 n. A/ o& a+ z+ T& M8 ]$ y
        {" T/ d* G( a+ g  p/ S* N
                read_MSG_buffer(pshreRAM);
' w" A$ r! @% v, g        }               
: [$ B& u% ~5 E5 i}& \3 Y' b5 q1 Y+ }6 F4 U8 z

7 G& l4 \: Z! ?+ y2 l# C0 rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 W" A: Q( ?. }
{
2 i( f8 T" o7 J3 W% N        RX_MSG_PROTOCOL buf;- }* M! k* d0 A
        ; E5 i. K5 E# ~
        buf.a = pshreRAM->a;8 K4 w  S+ G" f
        buf.b = pshreRAM->b;
4 z4 j4 A. z' N- I  G7 Y        buf.packet_cout = pshreRAM->packet_cout;
6 u0 a; Z- P  y; w% ^: F' C        ) D$ h" L- o" k! `* `
        if(buf.packet_cout != count_copy), `! Q2 M$ w# {# {. C% K
        {
$ t$ A  A6 _" k6 x% l* l7 N                printf("a is %d\n", buf.a);
) p0 Q* m  }& p, x                printf("b is %d\n", buf.b);
: l( h& z  `3 U                printf("count is %d\n", buf.packet_cout);4 D* L( I% Z* r8 t0 V
                count_copy = buf.packet_cout;
- a, L6 g8 R3 ]4 }        }
$ ~$ ^- O: m8 C# r. Q        else
0 E  F! `, l1 p- _( o* k9 i        {
. K4 w* z* X* t& W1 m                printf("No effective message!");8 \5 J: n! ~, {) q$ m' ~: @1 s0 G
        }; }  O/ V7 z+ k. k. v& a
}! e4 |5 R, r- M$ r) j) k- W# a3 C& m$ C

: e- \. h/ O' z! S3 X1 R% q: T
, k# @2 J! \" h' U. @4 U$ d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- n, V3 q' E3 k) w
使用下面代码,对内存使用了mmap函数后:# J! p: i1 \' ]( R( a
#include <stdio.h>
( }6 V8 S! @$ c# K- F' c#include <unistd.h>
$ T, N: b, l9 F5 u. ^" O#include <sys/mman.h>& [4 U; B0 Q  O7 F" @& V, V7 X* r
#include <sys/types.h>
8 C: y; w, k# O7 @$ E( w#include <fcntl.h>
8 t3 o( C# v6 ?( @+ k  ?; ]6 [  y- g- w% U0 K" M3 D. y
#define SHAER_RAM_BASE_ADDR    (0x80000000)& }  p# \5 l5 C: U* z
#define SHAER_RAM_SIZE         (0x20000)   
* [# K: B. n" Z/ H; B
* r+ c# y  r8 X% \7 _- i& Xtypedef struct
9 P) q+ h2 w  M9 ~+ r{
( B, F4 A' z/ |" H$ N2 p        unsigned int a;# O4 r& f' J, h6 o
        unsigned int b;
, W& z9 L  l8 v; d5 h/ N) {        unsigned int packet_cout;
: `& k7 d' X, L7 @- Q/ T% A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# ^; }7 K) J* O. M
1 A) i# v/ p3 E7 P, ^* s! Evoid read_MSG_buffer(int *baseaddr);4 B+ I, ?  P$ D' `) W8 K; A
unsigned int count_copy = 0;6 y8 L# m7 v( p. [
. a4 \5 O/ l1 s: ], K
int main()) r8 \0 Y; e* w$ `! N' _
{
7 d( V0 O0 C/ m! V        int fd;4 ^; E) F# h8 ]5 c/ T$ X
        int *mem = NULL;1 s6 i' l, i. {( i" O' `
  F, S5 p, r& L* U
        if((fd = open("/dev/mem", O_RDWR)) <0)
2 \3 |8 z' W) V) A: b4 V' d        {/ d1 A' M# n  C: E
                perror("open error");0 q! o  _% |+ v0 s$ q
                return -1;# R+ D  J+ t  E) U, a* n- ^
        }
( n  N& n7 d  ]2 K" t        & A0 [8 ~$ N' R! V( q! K0 U
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 h4 b& P  y# S5 O+ `. T- K1 M
: i9 Y5 M' @+ |0 c0 ~0 l7 [, k/ Y
        while(1)
/ x+ ]9 w- d: N% I% d        {
6 Z" z3 |1 i  |                read_MSG_buffer(mem);
; [# f& m% F8 s! b        }                ! D: ?6 r7 B. C
}
5 W( k% e8 U, @8 @. T
8 v( ]) g2 H/ s7 [+ Tvoid read_MSG_buffer(int *baseaddr); A0 N1 g' w, s5 X. H
{
2 n5 t; ^  f& |) S/ g        pRX_MSG_PROTOCOL pshreRAM = NULL;6 J0 K8 |& w# y
; N( m: a( i0 i* S' k
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) ~  C$ S; f# V6 w+ r, Y
% z7 y" j2 {" o0 b
        if(pshreRAM->packet_cout != count_copy)
- J, l: Z2 S: y) R! \' o, R        {
7 ]! Y5 O% Z$ b) I) _3 ]                printf("a is %d\n", pshreRAM->a);( l3 b0 m! r% C8 e, @
                printf("b is %d\n", pshreRAM->b);
( j8 p: l4 x& d0 E* g                printf("count is %d\n", pshreRAM->packet_cout);8 a1 x+ I8 o/ F1 M  x9 ^: \
                count_copy = pshreRAM->packet_cout;
5 R3 l4 X* U' u$ z6 f# ^        }3 s* w8 ]2 a) m4 X
        else
1 m' t2 P* }7 j        {
0 Z. Q4 n' h0 Z8 ^; ?6 y7 N                printf("No effective message!\n");
8 W4 h( }2 n4 H  J) m1 U* O        }
4 `! k6 x; }: a0 d  w6 O}0 Q' Q4 ~* k5 F  W3 |' Q% m
4 V! Z; n* I, T4 N  A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* U5 J8 z0 }5 F% }0 ]' v4 T% t/ d

5 o0 K! q: u; M: p1 t- V
+ z# @; d% i3 O' T6 U+ X) |( b: Q6 @6 J0 o; _. U: e

% ~6 S- o$ ?1 y8 A  W7 |$ Z* e; \+ |1 M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-22 17:14 , Processed in 0.039199 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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