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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% w1 k6 a+ ?1 p, j! [
) R' h7 F7 o) ]; i  DOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 g# S# o( g+ [3 H" p) ^8 K#include <unistd.h>0 A+ b7 E9 a4 v# v: z( b
#include <sys/mman.h>) P" `+ [/ o$ _$ D( Y
#include <sys/types.h>
5 T& N1 p. X" [( p: ]6 m#include <fcntl.h>7 A6 Q) g$ g* {! [6 [4 d" _

4 ^3 h/ Q  W" |% I; C#define SHAER_RAM_BASE_ADDR    (0x80000000)   + v; J. \! w* _( Z' [

/ C* b" B4 ]% T4 `& v" R: ~: f% atypedef struct& h) J/ }' b- ]# \$ ~8 I
{
, U  \1 I) W* W5 p3 Z1 {! M  q# b        unsigned int a;. |  D' O: n: k+ s9 ]# T
        unsigned int b;
* i4 w5 z2 v, ]( C; @+ b2 v  x        unsigned int packet_cout;
$ d0 ], ^  W7 u  G( ~4 g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 A, K% m4 n. j$ u/ e5 r2 h1 o
8 r9 F4 R0 s0 Q, Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. l9 z7 D9 p& X* _# }+ h6 yunsigned int count_copy = 0;8 \* y5 @+ [1 ]7 S* W! n" {
, O( M: P) Q7 G
! @6 D3 m. B% y6 @( D1 Q
int main()( g2 B$ K( b& ~) M  Z
{
7 z" e6 y  w4 y, O        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ T! Z/ g* K. ?& C0 j        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( R% M6 z" A% x

0 V2 N# n* [8 A0 y1 Y6 ~& F6 A5 B+ V        while(1)
) G0 n2 ^$ s/ Z9 u' q        {
' D" P# W5 j% T                read_MSG_buffer(pshreRAM);
$ O) l' [8 t7 b( c; S6 P        }                % Z$ M% [% o+ L' H
}
- u) x" ]; f2 J9 t$ o
& p  t! k1 G4 hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); r" W) I- z2 I6 W  d* b, S
{- C& L/ W( o- L) G
        RX_MSG_PROTOCOL buf;
; S% I$ l! t# {- I. Q0 C; N        
' a6 j  Q# z! \! o( f# x, {# a0 C        buf.a = pshreRAM->a;
5 o% Y0 H. p) E4 E0 f1 C! A% E        buf.b = pshreRAM->b;
0 Q8 G* v7 \1 l6 u% B1 C        buf.packet_cout = pshreRAM->packet_cout;
0 T  K# k3 e' k9 G, Z. }        
4 {* l  h& H; f& L3 f        if(buf.packet_cout != count_copy)+ n8 t* E0 |8 Q7 s0 g5 o: j& [% _
        {
0 g3 {: s: Q3 J. w                printf("a is %d\n", buf.a);
; x7 B8 l. l  a6 X  m* Z* c                printf("b is %d\n", buf.b);
: g8 d9 z7 ?' x+ _! S1 f                printf("count is %d\n", buf.packet_cout);, b/ {; ]4 ^% p$ B. C
                count_copy = buf.packet_cout;6 O3 `6 i4 m( a  B
        }+ s' k  m8 ]& O: Q+ s% v
        else2 J& k6 E9 c0 w) N8 G) _! ]
        {6 R; d( @4 @( x
                printf("No effective message!");
, |1 `& A, @3 }# H, r" H0 G        }* B( O& H" K2 O, y0 |0 N
}. d$ z  v- o! B0 Q4 }. l

- |% G1 W  k+ i8 z; v3 c: F
. E! `% n  `* `- J3 R但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ ~4 p0 A6 T- C5 H+ g3 c" `
使用下面代码,对内存使用了mmap函数后:: e' R% Z( K0 \/ X6 [. T
#include <stdio.h>
1 c5 ~3 {& a3 M0 f$ T6 {4 k8 i) U#include <unistd.h>
  O' u* o% v6 Y4 r$ F1 n0 I#include <sys/mman.h>4 w% {- b& B" o* l! x" K
#include <sys/types.h>. K! {* o3 z1 r  P* ?, k
#include <fcntl.h>8 p+ F4 o( T2 U) [2 A$ h7 R/ I! A
8 O3 ]0 |0 K* \. v/ m' `3 J4 r
#define SHAER_RAM_BASE_ADDR    (0x80000000)
9 s# }5 o5 y6 `5 Y: U: L#define SHAER_RAM_SIZE         (0x20000)   
  r2 O" s0 Z' z, g
# ^% {' I" m0 k& |8 H2 H5 U2 Wtypedef struct" H0 |- q- c+ i
{
8 o' a6 ^, z/ l; ~2 K) c, h        unsigned int a;
2 E  T3 _) z& z3 `9 j2 y  t        unsigned int b;
+ F4 x. T& o4 K9 |$ {        unsigned int packet_cout;. S; m/ Z* x4 c" X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 v, y' \2 f. z' {( B5 {8 I) M
) m! z/ B5 M7 }4 C1 ^/ U  I# e
void read_MSG_buffer(int *baseaddr);
' d+ k, v' [! Y/ a+ lunsigned int count_copy = 0;
4 Y2 I& n. {5 L& m/ l! |2 Q* ]- M
int main()* \: N6 ~. l. B( `
{; |- p2 R! ~( M# K9 M( r) J
        int fd;* m( ?7 d- j: I! f" U
        int *mem = NULL;& l# F! H+ {* H* e
- t6 {& G' B0 a
        if((fd = open("/dev/mem", O_RDWR)) <0)
+ c$ ?1 w* O/ u. O6 }& I        {
) V, c, B: n) y1 ?3 F4 }# R6 T                perror("open error");
. ^# p) N, U' H' K: g6 s4 b                return -1;
- y* p: H* S9 S  m: P        }
6 H; F$ I* T) U/ K        
: c' @& C# I4 s# ^- ]        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" F* G6 }- @( {2 r- H
+ [; A6 P# d" d
        while(1)
$ _$ v$ a: y8 U2 Q$ |0 |/ S7 p        {; V5 z' p0 c1 S" t
                read_MSG_buffer(mem);% f3 i7 I4 \' _
        }               
( d/ X9 ]  q/ ~! H+ F}
6 o0 i$ d  o& t; ~- U. h* O7 X' g4 L7 I: _/ p( X3 v
void read_MSG_buffer(int *baseaddr)
% Z- u0 U) {) k/ g! Y{9 |" W& V7 j* x* c1 E2 N0 d
        pRX_MSG_PROTOCOL pshreRAM = NULL;- U9 f& x! O0 U6 {

3 ~0 T% Y0 g2 M3 T. ^8 j9 o4 v        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 D5 _3 a' J0 u" }" `: n* X7 ?8 k1 T; P% R  F
        if(pshreRAM->packet_cout != count_copy)
+ d) V6 q/ r2 b& K7 [        {
, h2 C: n+ n! B; o9 I% x                printf("a is %d\n", pshreRAM->a);+ q- b+ N6 T7 J/ D! A  \
                printf("b is %d\n", pshreRAM->b);: i' Y2 v; N# P/ ^% I
                printf("count is %d\n", pshreRAM->packet_cout);
; h$ e. Y. ~& Q                count_copy = pshreRAM->packet_cout;% \. O& u% O8 }: v; T0 O
        }" T2 \, |7 F4 p& w, T  N! d
        else
$ `( Q! p( B" i. N3 X7 [9 c4 E        {
% p6 [5 ^# b7 D# R                printf("No effective message!\n");
0 @) j) A( T' F* m" z( M0 Y        }2 X' l1 b- I( `# O! y
}+ B9 c9 M: c, J( F" e' D+ @

/ t; T2 h# x0 ^6 p$ M* T没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; T* C: z1 ]* u& p+ C8 M

; |1 {2 G" l/ Z& i* d! i9 [0 {9 i- R+ L

) k* U: v; A! i& v% n/ Q( [2 P) a% `2 X, _+ a# w" M' u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-31 04:15 , Processed in 0.040664 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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